2012-04-10 33 views
2

我正试图在R上实现一个Marquardt算法。我看了一下nls.lm函数的例子,并试图根据它来编写一些东西。这里是我的代码。(RESULT1是262个值的专栏中,我需要做一个最适合的指数平滑过度)R的Marquardt算法

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。

非常感谢您的宝贵时间。 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。 再次感谢! – 2012-04-12 11:08:13