Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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函数和起始值_R - Fatal编程技术网

R nls函数和起始值

R nls函数和起始值,r,R,我想知道如何找到/选择nls函数的起始值,因为我输入的任何值都会出错。我还想确认我可以在我的数据集上使用nls函数 data [1] 108 128 93 96 107 126 105 137 78 117 111 131 106 123 112 90 79 106 120 [20] 91 100 103 112 138 61 57 97 100 95 92 78 week = (1:31) > data.fit = nls(data~M*(((P+Q

我想知道如何找到/选择nls函数的起始值,因为我输入的任何值都会出错。我还想确认我可以在我的数据集上使用nls函数

    data
 [1] 108 128  93  96 107 126 105 137  78 117 111 131 106 123 112  90  79 106 120
[20]  91 100 103 112 138  61  57  97 100  95  92  78

week = (1:31)

> data.fit = nls(data~M*(((P+Q)^2/P)*exp((P+Q)*week)/(1+(Q/P)*exp(-(P+Q)*week))^2), start=c(M=?, P=?, Q=?))

如果我们稍微修改一下函数并使用nls2来获得起始值,那么我们就可以使它收敛。我们使用的模型是:

log(data) = .lin1 + .lin2 * log((exp((P+Q)*week)/(1+(Q/P)*exp(-(P+Q)*week))^2))) +error
在这个模型中.lin1=log(M*((p+Q)^2/p)),当.lin2=1时,它将简化为问题中的模型(除了乘法误差而不是加法误差,以及参数化不同但适当简化后给出相同预测的事实)。这是一个4参数模型,而不是3参数模型

线性参数为.lin1和.lin2。我们使用的是
algorithm=“plinear”
,它不需要这些参数的起始值。线性公式的RHS被指定为一个矩阵,每个线性参数有一列指定其系数(可能是非线性参数的非线性函数)

代码是:

data <- c(108, 128, 93, 96, 107, 126, 105, 137, 78, 117, 111, 131, 106, 
123, 112, 90, 79, 106, 120, 91, 100, 103, 112, 138, 61, 57, 97, 
100, 95, 92, 78)
week <- 1:31
if (exists("fit2")) rm(fit2)
library(nls2)

fo <- log(data) ~ cbind(1, log((exp((P+Q)*week)/(1+(Q/P)*exp(-(P+Q)*week))^2)))

# try maxiter random starting values
set.seed(123)
fit2 = nls2(fo, alg = "plinear-random", 
     start = data.frame(P = c(-10, 10), Q = c(-10, 10)),
     control = nls.control(maxiter = 1000))

# use starting value found by nls2
fit = nls(fo, alg = "plinear", start = coef(fit2)[1:2])
plot(log(data) ~ week)
lines(fitted(fit) ~ week, col = "red")

找到好的起始值不是一项编程任务,而是一项数学任务。你有一个相当复杂的函数,因此很难找到一个好的匹配项也就不足为奇了。nls2包允许搜索一个网格以获得好的起始值。如果你知道参数的合理范围,你可以尝试一下。这是可能的布莱:这是一个与罗兰重复的问题,你认为这个问题最好问哪个?还是?
> fit
Nonlinear regression model
  model: log(data) ~ cbind(1, log((exp((P + Q) * week)/(1 + (Q/P) * exp(-(P + Q) * week))^2)))
   data: parent.frame()
       P        Q    .lin1    .lin2 
 0.05974 -0.02538  5.63199 -0.87963 
 residual sum-of-squares: 1.069

Number of iterations to convergence: 16 
Achieved convergence tolerance: 9.421e-06