R nls功能和起始值

时间:2015-04-26 08:30:06

标签: 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)^2/P)*exp((P+Q)*week)/(1+(Q/P)*exp(-(P+Q)*week))^2), start=c(M=?, P=?, Q=?))

1 个答案:

答案 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

enter image description here