与nls不同,nls2将向量初始值视为单个元素

时间:2017-10-28 05:21:23

标签: r curve-fitting nls

我注意到我可以使用nls来拟合参数向量,如下所示。这让我决定了我想要适合的参数数量。如下例所示;在哪里我适合y = k + a_1 x^2 + a_2 x^3 + a_3 x^3。我可以简单地改变初始值的数量,这会改变要估算的系数的数量。

但是,这种方法不适用于nls2。它仅仅适合y = k + a_1 * x三次!

我的问题是如何让nls2根据初始值确定适合的参数数量 - 或类似的内容 - 与nls的情况一样。

我对nls或类似的套餐没有太多经验。所以,我正在努力修补它。我猜nls2的功能比nls ...

更多

适合

的数据和模型
x <- c(32,64,96,118,126,144,152.5,158)  
y <- c(99.5,104.8,108.5,100,86,64,35.3,15)


model_fun <- function(x, int_sep, para) {
  int_sep +  rowSums(sapply(1:length(para), function(i) para[i] * x^i))
}

使用nls

mod_nls <- nls(y ~ model_fun(x, int_sep, para), 
             start = list(int_sep = 0, para=c(1, 1, 1)))

mod_nls
# Nonlinear regression model
# model: y ~ model_fun(x, int_sep, para)
# data: parent.frame()
# int_sep      para1      para2      para3 
# 1.269e+02 -1.626e+00  2.910e-02 -1.468e-04 
# residual sum-of-squares: 65.87
# 
# Number of iterations to convergence: 1 
# Achieved convergence tolerance: 1.732e-07

使用nls2

 mod_nls2 <- nls2(y ~ model_fun(x, int_sep, para), 
                start = list(int_sep = 0, para=c(1, 1, 1)))

mod_nls2
# Nonlinear regression model
# model: y ~ model_fun(x, int_sep, para)
# data: parent.frame()
# int_sep     para 
# 143.0438  -0.5966 
# residual sum-of-squares: 3661
# 
# Number of iterations to convergence: 1 
# Achieved convergence tolerance: 7.602e-09

编辑:我对这个特定模型不感兴趣 - 这似乎是一个简单的例子

2 个答案:

答案 0 :(得分:1)

您不需要猜测nls2的功能。阅读文档。您可以在程序包错误跟踪器上报告此问题,但我怀疑@ G.Grothendieck不会修复它,除非您提供修复程序。

无论如何,我会改变你的功能。

model_fun <- function(x, int_sep, ...) {
  para <- c(...)
  #I prefer matrix algebra over a loop:
  int_sep +  c(tcrossprod(para, outer(x, seq_along(para), "^")))
}

library(nls2)
mod_nls2 <- nls2(y ~ model_fun(x, int_sep, alpha1, alpha2, alpha3), 
                 start = list(int_sep = 0, alpha1 = 1, alpha2 = 1, alpha3 = 1))

mod_nls2
#Nonlinear regression model
#  model: y ~ model_fun(x, int_sep, alpha1, alpha2, alpha3)
#   data: <environment>
#   int_sep     alpha1     alpha2     alpha3 
# 1.269e+02 -1.626e+00  2.910e-02 -1.468e-04 
# residual sum-of-squares: 65.87
#
#Number of iterations to convergence: 1 
#Achieved convergence tolerance: 1.732e-07

答案 1 :(得分:1)

nls2在内部将start=参数转换为数据框,如果您以as.data.frame(as.list(start))工作的形式提供它(示例中“工作”意味着它创建数据)具有1行和2列的框架,两个参数中的每一个都有一列 - 请注意,数据框列可以容纳复杂对象)然后您应该没问题:

nls2(y ~ model_fun(x, int_sep, para), 
  start = list(int_sep = 0, para = I(t(c(1, 1, 1)))))