2017-11-19 15 views
0
newtonraphson <- function(ftn, x0, tol = 1e-9, max.iter = 100) { 
x <- x0 
fx <- ftn(x)  
iter <- 0 
while ((abs(fx[1]) > tol) & (iter < max.iter)) { 
    x <- x - fx[1]/fx[2] 
    fx <- ftn(x) 
    iter <- iter + 1 
    cat("At iteration", iter, "value of x is:", x, "\n") 
} 
if (abs(fx[1]) > tol) { 
    cat("Algorithm failed to converge\n") 
    return(NULL)} 
    else { 
    cat("Algorithm converged\n") 
    return(x)} 
} 

X <- c(3,1,2,0,6,8,4,5,7,0)  
n <- 10 
lambda <- seq(0,10,0.01) 
ftn <- function(p) { 
for (i in 1:10){ 
fp <- sum(X[i])*log(lambda) - 10*lambda 
dfp <- (1/lambda)*sum(X[i]) - 10 
} 
return(c(fp,dfp)) 
} 

newtonraphson(ftn, 0.1, 1e-06) 

이것은 람다의 최대 우도 추정치를 찾는 코드입니다. 나는이 문제를 해결할 수없는 것MLE 용 Newton Raphson 코드 - TRUE/FALSE가 필요한 누락 값

Error in while ((abs(fx[1]) >= tol) & (iter <= max.iter)) { : 
missing value where TRUE/FALSE needed 

: 그러나, 나는이 오류가 발생했습니다. 아무도 도와 줄 수 있니? 감사합니다.

+0

음 '람다'가 0에서 시작하도록하지 마십시오.'lambda <- seq (0.1,10,1e-06)'와 같은 것을하십시오. 'X' 란 무엇입니까? 왜'sum (X [i])'인가? 'sum (X)'는 그것을 수행해야하지만'X'를위한 데이터가 없어야합니다. 그래서 추측 할 수 있습니다. – Bhas

+0

입력 해 주셔서 감사합니다. X는'X <- c (3,1,2,0684570)'입니다. 'sum ([i])'에 대해서, 나는 poisson의 로그 가능성을 표현하려고 노력했다 :'log (λ) = logλΣXi - nλ - ΣLogXi! ' –

+0

아닙니다. 왜'lambda <- seq (...)'를하고 있습니까? 첫 번째 용어에서'ftn'에 괄호를 사용하십시오. 왜 ftn에서 함수 인자'p'를 사용하지 않습니까? 이것은 작동하지 않습니다. – Bhas

답변

1

포아송 분포에서 lambda의 MLE를 찾고 있습니다. 그러나 최대 확률을 제공하지 않는 ftn(lambda)=0을 풀고 있습니다 (인수 p가 실제로 lambda의 값이라고 가정).

Poisson distribution in Wikipedialambda의 MLE는 sum(X)/length(X)입니다.

ftn의 파생어를 0으로 설정하고 lambda을 해결해야합니다. 이를 위해서는 newtonraphson이 필요하지 않습니다.

해결 방법 (1/lambda)*sum(X[i]) - 10=0 위키피디아에서 표현식을 제공합니다. (10은 length(X) 임).