2012-04-10 4 views
2

RでMarquardtアルゴリズムを実装しようとしています.nls.lm関数の例を見て、それに基づいて何かを書き込もうとしました。ここでは(結果1は、262個の値の列であること、私は最高のフィット感指数平滑を超える行う必要があります)MarquardtアルゴリズムR

n=seq(1:262) 

x=result1 

#observed values 
obs<-function(nn) x[nn+1] 

#exponentially smoothed values 
pred<-function(p, nn) ifelse(nn==1, obs(0), p*obs(nn-1)+(1-p)*Recall(p, nn-1)) 

#residuals 
resFun<-function(p, nn) obs(n)-pred(p, nn) 

nls.out<-nls.lm(par=0.33, resFun, nn=n, control = nls.lm.control(nprint=1))) 

。私のコードですが、それは私に、このエラーを与え続けています。

Error in x[n + 1] : only 0's may be mixed with negative subscripts 

私はそれがどこかの関数の定義の中で途方もなく愚かな間違いでなければなりません実現していますが、私が間違っているのかを見ることができるかどうか見てください。 これをExcelで解くと、p = 0.33から始まり、ソルバーは0.55114になりました。

お時間を頂きまして、ありがとうございます。 Arpine

答えて

1

問題は、あなたのpred機能付きです。 それは本当にベクトル化されていないと であっても、開始値で呼び出すことはできません。 再帰の代わりにループを使用して書き換えることができます。

smooth <- function(x,alpha) { 
    res <- x 
    for(i in seq_along(x)[-1]) { 
    res[i] <- (1-alpha) * res[i] + alpha * res[i-1] 
    } 
    res 
} 

library(minpack.lm) 
x <- rnorm(20) 
resFun <- function(alpha) { 
    x - smooth(x, alpha) 
} 
r <- nls.lm(par=0.33, resFun, control = nls.lm.control(nprint=1)) 

最適値は、当然、ゼロである: より多くのあなたが遠くにあなたがしているデータから、データを滑らかに。

+0

これは機能します。本当にありがとう!唯一のことは、x <-rnorm(20)を含んでいないということです。これはx値を駄目にするので、必要ないと思います。また、私はインデックスで少し演奏しなければならないが、それは小さなものであり、それは完全に動作し、私が望むものに近づく:〜0.55。 もう一度おねがいします! –

関連する問題