2014-02-10 3 views
4

-pi와 pi 사이의 로그 우도 함수를 그래프로 나타내려고합니다.로그 우도 함수를 그래프로 표시하는 방법

그것은 기능을 플롯하는 데 실패

llh <- function (teta,x) { 

    sum(log((1-cos(x-teta))/(2*pi))) 
} 

x=c(3.91,4.85,2.28,4.06,3.70,4.04,5.46,3.53,2.28,1.96,2.53,3.88,2.22,3.47,4.82,2.46,2.99,2.54,0.52,2.50) 

teta=seq(-4,4, by=0.01) 

y = llh(teta,x) 

plot(teta, llh(teta,x), pch=16) 

로그 우도 함수. 함수가 teta의 하나 개의 값과 여러 x 값 또는 teta의 여러 값 하나 개 x 값을 작동 서면으로

Warning message: 
In x - teta : 
    longer object length is not a multiple of shorter object length 
> 
> plot(teta, llh(teta,x), pch=16) 
Error in xy.coords(x, y, xlabel, ylabel, log) : 
    'x' and 'y' lengths differ 
In addition: Warning message: 
In x - teta : 
    longer object length is not a multiple of shorter object length 
+0

오류 메시지가 매우 분명해 보입니다. 'llh (teta, x)'는'sum'이 벡터화되지 않기 때문에 오직 하나의 값일 것입니다. (그뿐 아니라 고등학교 수학 서적에서 음수 로그를 얻는 것에 대해 검토해야합니다.) –

+0

마지막으로 확인한 결과, 파이가 4가 아니 었습니다. – Spacedman

답변

6

다음은 오류 메시지입니다. 그렇지 않으면 잘못된 값이나 경고가 나타납니다.

예 : 시도하고 세 할 경우

> llh(c(1,2),x) 
[1] -49.50943 

: 그리고 기본적으로 제공

> llh(c(1,2,3),x) 
[1] -49.52109 
Warning message: 
In x - teta : 
    longer object length is not a multiple of shorter object length 

teta=1teta=2에 대한 llh :

> llh(1,x) 
[1] -34.88704> 
> llh(2,x) 
[1] -60.00497 

는 동일하지 않습니다 로부터 :

> cos(x-c(1,2,3)) 
[...] 
Warning message: 
In x - c(1, 2, 3) : 
    longer object length is not a multiple of shorter object length 

R은 길이가 20 인 벡터에서 길이 3 벡터를 뺍니다. 길이 20 벡터에 대해 길이 3 벡터를 6 번 반복 할 때까지 길이 3 벡터를 반복합니다. 그러면 두 요소 만 남아 있습니다. Hmmmm ... R, 나는 이것을 할 것입니다.하지만 잘못 보입니다. 그래서 여기 경고가 있습니다.

두 인수의 벡터를 처리하는 함수를 다시 작성하거나 함수를 래핑하여 벡터화 할 수 있습니다.

> vllh = Vectorize(llh,"teta") 
> vllh(c(1,2,3),x) 
[1] -34.88704 -60.00497 -67.30765 
> plot(teta, vllh(teta,x)) 

ll plot

+0

도움을 주셔서 감사합니다. – bowshock

2

이 기능을 사용해야합니다 sapply (읽기? sapply) 코드가 함수를 벡터화하는

plot(teta, sapply(X=teta, FUN=function(teta) llh(teta, x=x)), type="l") 

또는

를 벡터화되지 않는 그 자체 :

llh2 <- function (teta,x) { 
    sapply(X=teta, FUN=function(teta) sum(log((1-cos(x-teta))/(2*pi)))) 
} 

plot(teta, llh2(teta,x), type="l") 
+1

'Vectorize'는 훨씬 더 재미 있습니다. – Spacedman

+1

Vectorize가 mapply를 호출하므로 해당 스타일에 동의하지 않습니다. – RockScience

+0

도움을 주셔서 감사합니다. – bowshock

0

또 다른 해결책은 외부 사용 : 나는 벡터화가 흥미 간격 남자와 동의

llh <- function (teta,x) { 
    X <- outer(x, teta, "-") 
    Y <- log((1-cos(X))/(2*pi)) 
    apply(Y, 2, sum) 
} 

x=c(3.91,4.85,2.28,4.06,3.70,4.04,5.46,3.53,2.28,1.96,2.53,3.88,2.22,3.47,4.82,2.46,2.99,2.54,0.52,2.50) 

teta=seq(-4,4, by=0.01) 

plot(teta, llh(teta,x), pch=16) 

!

관련 문제