2

我正在尝试在 R 上实现 Marquardt 算法。我查看了 nls.lm 函数上的示例并尝试基于它编写一些东西。这是我的代码。(结果 1 是一列 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))

不出所料,最佳值为零:对数据进行的平滑越多,离数据越远。

于 2012-04-10T15:11:13.000 回答