Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 与nls不同,nls2将向量化初始值视为单个元素_R_Curve Fitting_Nls - Fatal编程技术网

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

R 与nls不同,nls2将向量化初始值视为单个元素,r,curve-fitting,nls,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有更多的功能 数据和模型匹配 使用nls2软件包

我注意到我可以使用
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
有更多的功能

数据和模型匹配 使用
nls2
软件包
mod_nls2您无需猜测
nls2
的功能。阅读文档。你可以在程序包bug跟踪器上报告这个问题,但我怀疑@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

model\u fun您无需猜测
nls2
的功能。阅读文档。你可以在程序包bug跟踪器上报告这个问题,但我怀疑@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

model\u fun
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)))))

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)))))

您的模型在参数上是线性的,因此可以(应该)与lm相匹配。@Roland,我根本不想要这个特定的模型。。。我只是想知道如何做到这一点。谢谢。@Roland这是另一个可能有用的例子:您的模型的参数是线性的,因此可以(应该)与lm相匹配。@Roland,我根本不想要这个特定的模型。。。我只是想知道如何做到这一点。谢谢。@Roland这是另一个有用的例子:谢谢你的回答。它很有用,我想知道如何引起G.格罗森迪克的注意。谢谢你的回答。这很有用,我想知道如何引起G·格罗森迪克的注意。
nls2(y ~ model_fun(x, int_sep, para), 
  start = list(int_sep = 0, para = I(t(c(1, 1, 1)))))