我想知道如何找到/选择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=?))
答案 0 :(得分:3)
如果我们稍微更改一下这个函数并使用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")
,并提供:
> 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