2

R に Marquardt アルゴリズムを実装しようとしています。 nls.lm 関数の例を見て、それに基づいて何かを書こうとしました。これが私のコードです(result1は262個の値の列であり、最適な指数平滑化を行う必要があります)

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で開始し、ソルバーはtop = 0.55114になりました。これは基本的に、0.33から始まる最適な値0.55114を見つけるために、私がやろうとしていることです。

お時間をいただき申し訳ございません。アルパイン

4

1 に答える 1

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 です。データを平滑化すればするほど、データから遠ざかります。

于 2012-04-10T15:11:13.000 に答える