与 nls 不同,nls2 将向量初始值视为单个元素
nls2 treats vectored initial values as single elements, unlike 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
(编辑:我对这个特定模型不感兴趣 - 这似乎是一个简单的例子)
关于 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
nls2
在内部将 start=
参数转换为数据框,因此如果您以 as.data.frame(as.list(start))
有效的形式提供它(在示例中 "works" 表示它创建了一个包含 1 行和 2 列的数据框,两个参数各占一列——请注意,数据框的列可以容纳复杂的对象)那么你应该没问题:
nls2(y ~ model_fun(x, int_sep, para),
start = list(int_sep = 0, para = I(t(c(1, 1, 1)))))
我注意到我可以使用 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
(编辑:我对这个特定模型不感兴趣 - 这似乎是一个简单的例子)
关于 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
nls2
在内部将 start=
参数转换为数据框,因此如果您以 as.data.frame(as.list(start))
有效的形式提供它(在示例中 "works" 表示它创建了一个包含 1 行和 2 列的数据框,两个参数各占一列——请注意,数据框的列可以容纳复杂的对象)那么你应该没问题:
nls2(y ~ model_fun(x, int_sep, para),
start = list(int_sep = 0, para = I(t(c(1, 1, 1)))))