我有一个庞大的时间序列数据集,涉及多个循环。但是,该模型无法收敛。我的模型如下所示。
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
答案 0 :(得分:2)
这是根据我的意愿而作的粗略指南。
为参数m
和b
选择起始值。
您可以通过将一些观察中的值X, Y, Z
插入模型中来缩小起始参数的范围;例如,使用Y=0
,X=1
和Z=37
进行测量,得出0 = b + m + 37
或b = -37 - m
。
选择参数D
的起始值。
如@jogo所建议,将(Y - Z)
绘制为X
的函数将使您对D
的合理起始参数有个好主意。在这种情况下,线性相关性D = 1
似乎是一个很好的初始猜测。
plot((Y - Z) ~ X, data = logar)
如果我们现在相应地修改起始参数,则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)
可重复输入的形式是:
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))