2017-11-19 18 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のニュートンラフソンコード - TRUE/FALSEが必要なTRUE/FALSEが必要です。

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

: しかし、私はこのエラーを得ました。誰でも助けることができますか? ありがとう!

+0

「lambda」は0で始まらないようにしてください。 'lambda < - seq(0.1,10,1e-06)'のようにしてください。 'X'とは何ですか?なぜ 'sum(X [i])'? 'sum(X)'はそれを行うべきですが、 'X'のためのデータはありません。 – Bhas

+0

入力いただきありがとうございます。 Xは 'X < - c(3,1,2,0,6,8,4,5,7,0)'です。 'sum([i])'については、私はポアソンの対数尤度を表現しようとしていました: 'log(λ)=logλΣXi - nλ - ΣLogXi! ' –

+0

本当にありません。なぜ 'lambda < - seq(...)'をやっているのですか?第1項では 'ftn'の括弧を使います。なぜあなたは 'ftn'で関数引数' p'を使わないのですか?これは動作しません。 – Bhas

答えて

1

ポアソン分布からlambdaのMLEを探しています。 しかし、尤度の最大値を与えないftn(lambda)=0を解決しています(引数pが実際にはlambdaの値であると仮定して)。

Poisson distribution in WikipediaからlambdaのMLEはsum(X)/length(X)です。

ftnの派生値を0に設定し、lambdaを解決する必要があります。あなたのためにあなたのnewtonraphsonは必要ありません。

Solve (1/lambda)*sum(X[i]) - 10=0これはあなたにWikipediaの表現を与えるでしょう。 (10はlength(X))。

関連する問題