非线性建模起始值

时间:2018-07-10 11:41:20

标签: r

我有一个庞大的时间序列数据集,涉及多个循环。但是,该模型无法收敛。我的模型如下所示。

Model <- nls(Y~b+m*X^D+Z, start = list(b=0.5,m=0.5, D=1),data=logar)

我只想清楚地确定非线性建模的起始值!

Data(logar)

X         Y                  Z
135      -0.171292376      85  
91      0.273954718        54   
171     -0.288513438       107
88       -0.17363066       54
59     -1.770852012        50
1        0                 37
1       0                  32
1       0.301029996        36
2       -0.301029996       39
1       1.041392685        30
11      -0.087150176       42
9        0.577236408       20
34       -0.355387658      28
15        0.329058719      17
32        -0.182930683     24
21        0.196294645      21
33        0.114954516      91
43       -0.042403849      111
39       -0.290034611       88
20       -0.522878746       76
6        -0.301029995       108
3         0.477121254       78
9          0                63
9          0.492915522      51
28       -0.243038048       88
16        -0.028028724      17
15      -0.875061263        29
2       -0.301029996        44
1        0                  52
1        1.531478917        65

2 个答案:

答案 0 :(得分:2)

这是根据我的意愿而作的粗略指南。

  1. 为参数mb选择起始值。

    您可以通过将一些观察中的值X, Y, Z插入模型中来缩小起始参数的范围;例如,使用Y=0X=1Z=37进行测量,得出0 = b + m + 37b = -37 - m

  2. 选择参数D的起始值。

    如@jogo所建议,将(Y - Z)绘制为X的函数将使您对D的合理起始参数有个好主意。在这种情况下,线性相关性D = 1似乎是一个很好的初始猜测。

    plot((Y - Z) ~ X, data = logar)
    

    enter image description here

如果我们现在相应地修改起始参数,则nlm会收敛

fit <- nls(Y ~ b + m * X ^ D + Z, start = list(b = -37 - 0.5, m = 0.5, D = 1), data = logar)
fit
#Nonlinear regression model
#  model: Y ~ b + m * X^D + Z
#   data: df
#       b        m        D
#-46.1134  -0.2118   1.0704
# residual sum-of-squares: 19846
#
#Number of iterations to convergence: 7
#Achieved convergence tolerance: 3.761e-06

答案 1 :(得分:1)

我们可以将模型编写为:

Y - Z ~ b + m * X^D

对于algorithm="plinear",只有非线性参数(在这种情况下仅为D)需要初始值,并且初始值可能不是特别重要。 (例如,至少在这种情况下,如果我们使用-1而不是1作为起始值,则需要进行几次迭代,但得到的答案是相同的。)请注意,plinear算法在右侧应该指定为矩阵,其列隐式乘以线性参数。

o <- order(logar$X)
fit.nls <- nls(Y - Z ~ cbind(1, X^D), logar[o, ], start = list(D = 1),
  algorithm = "plinear")

在6次迭代中收敛到以下内容:

> fit.nls
Nonlinear regression model
  model: Y - Z ~ cbind(1, X^D)
   data: logar[o, ]
       D    .lin1    .lin2 
  1.0703 -46.1135  -0.2118 
 residual sum-of-squares: 19846

Number of iterations to convergence: 6 
Achieved convergence tolerance: 8.814e-06

鉴于D非常接近1,您可能希望将模型简化为:

fit.lm <- lm(Y - Z ~ X, logar)

在视觉上,这些模型拟合似乎难以区分:

plot(Y-Z ~ X, logar)
lines(fitted(fit.nls) ~ X, logar[o, ], col = "red", lty = 2)
abline(fit.lm, col = "blue", lty = 3)

screenshot

注意

可重复输入的形式是:

logar <- structure(list(X = c(135L, 91L, 171L, 88L, 59L, 1L, 1L, 1L, 2L, 
1L, 11L, 9L, 34L, 15L, 32L, 21L, 33L, 43L, 39L, 20L, 6L, 3L, 
9L, 9L, 28L, 16L, 15L, 2L, 1L, 1L), Y = c(-0.171292376, 0.273954718, 
-0.288513438, -0.17363066, -1.770852012, 0, 0, 0.301029996, -0.301029996, 
1.041392685, -0.087150176, 0.577236408, -0.355387658, 0.329058719, 
-0.182930683, 0.196294645, 0.114954516, -0.042403849, -0.290034611, 
-0.522878746, -0.301029995, 0.477121254, 0, 0.492915522, -0.243038048, 
-0.028028724, -0.875061263, -0.301029996, 0, 1.531478917), Z = c(85L, 
54L, 107L, 54L, 50L, 37L, 32L, 36L, 39L, 30L, 42L, 20L, 28L, 
17L, 24L, 21L, 91L, 111L, 88L, 76L, 108L, 78L, 63L, 51L, 88L, 
17L, 29L, 44L, 52L, 65L)), class = "data.frame", row.names = c(NA, 
-30L))