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