将 R 中的 MLE 和 NLS 函数用于非线性模型
Using the MLE and NLS functions in R for a nonlinear model
我在实施 MLE 和 NLS 模型以进行我尝试执行的某些估计时遇到了一些问题。型号如下
Y=A*(K^b_1)*(L^b_2)+e
其中 e 只是误差项,B 和 D 是输入变量。目标是尝试估计 b_1 和 b_2。我的第一个等式是,我如何将它放入 nls 函数中,因为当我尝试这样做时,我得到以下错误
prod.nls<-nls(Y~A*(K^Beta_1)*(L^Beta_2), start =list(A = 2, Beta_1= 2, Beta_2=2))
Error in numericDeriv(form[[3L]], names(ind), env) :
Missing value or an infinity produced when evaluating the model
我的另一个问题是上面的模型可以根据日志重写,
log(Y)= log(A)+b_1log(K)+b_2log(L)
我省略了误差项,因为它变得不敬,而且 A 只是一个标量,所以我也将其省略。但是,当我使用 mle 函数将该模型放入 R 时,出现如下错误,
prod.mle<-mle(log(Y)~log(K)+log(L))
Error in minuslogl() : could not find function "minuslogl"
In addition: Warning messages:
1: In formals(fun) : argument is not a function
2: In formals(fun) : argument is not a function
下面提供了数据集中的一小部分 table 值,以便能够重现这些错误。
感谢您提前的帮助。
Y
K
L
26971.71
32.46371
3013256.014
330252.5
28.42238
135261574.9
127345.3
5.199048
39168414.92
3626843
327.807
1118363069
37192.73
16.01538
9621912.503
1) 尝试删除 A 并仅使用其他 2 个参数进行优化。然后使用结果作为起始值重新优化。在 nls 的第二个应用中,我们使用 plinear 算法,它不需要线性输入参数的起始值。当使用 plinear
时,右侧应该是一个矩阵,使得线性参数与每一列相乘。在这种情况下,我们只有一列。
fo <- Y ~ cbind(A = (K^Beta_1) * (L^Beta_2))
st <- list(Beta_1 = 2, Beta_2 = 2)
fm0 <- nls(fo, DF, start = st)
fm1 <- nls(fo, DF, start = coef(fm0), alg = "plinear"); fm1
给予:
Nonlinear regression model
model: Y ~ cbind(A = (K^Beta_1) * (L^Beta_2))
data: DF
Beta_1 Beta_2 .lin.A
0.25399 0.81422 0.03572
residual sum-of-squares: 2.468e+09
Number of iterations to convergence: 7
Achieved convergence tolerance: 6.56e-06
2) 如果我们取两边的对数,那么假设我们使用 log(A) 而不是 A 作为一个参数,则公式在所有参数中都是线性的,因此我们可以使用 lm
。请注意,这不是与原始问题完全等效的问题,尽管它对您来说可能足够接近。下面我们将其用作获取起始值的替代方法。
fm2 <- lm(log(Y) ~ log(K) + log(L), DF)
co2 <- coef(fm2)
st2 <- list(Beta_1 = co2[[2]], Beta_2 = co2[[3]])
fm3 <- nls(fo, DF, start = st2, alg = "plinear"); fm3
给予:
Nonlinear regression model
model: Y ~ cbind(A = (K^Beta_1) * (L^Beta_2))
data: DF
Beta_1 Beta_2 .lin.A
0.2540 0.8143 0.0357
residual sum-of-squares: 2.468e+09
Number of iterations to convergence: 6
Achieved convergence tolerance: 3.744e-06
备注
可重现形式的输入DF
是:
DF <- structure(list(Y = c(26971.71, 330252.5, 127345.3, 3626843, 37192.73
), K = c(32.46371, 28.42238, 5.199048, 327.807, 16.01538), L = c(3013256.014,
135261574.9, 39168414.92, 1118363069, 9621912.503)),
class = "data.frame", row.names = c(NA, -5L))
我在实施 MLE 和 NLS 模型以进行我尝试执行的某些估计时遇到了一些问题。型号如下
Y=A*(K^b_1)*(L^b_2)+e
其中 e 只是误差项,B 和 D 是输入变量。目标是尝试估计 b_1 和 b_2。我的第一个等式是,我如何将它放入 nls 函数中,因为当我尝试这样做时,我得到以下错误
prod.nls<-nls(Y~A*(K^Beta_1)*(L^Beta_2), start =list(A = 2, Beta_1= 2, Beta_2=2))
Error in numericDeriv(form[[3L]], names(ind), env) :
Missing value or an infinity produced when evaluating the model
我的另一个问题是上面的模型可以根据日志重写, log(Y)= log(A)+b_1log(K)+b_2log(L)
我省略了误差项,因为它变得不敬,而且 A 只是一个标量,所以我也将其省略。但是,当我使用 mle 函数将该模型放入 R 时,出现如下错误,
prod.mle<-mle(log(Y)~log(K)+log(L))
Error in minuslogl() : could not find function "minuslogl"
In addition: Warning messages:
1: In formals(fun) : argument is not a function
2: In formals(fun) : argument is not a function
下面提供了数据集中的一小部分 table 值,以便能够重现这些错误。 感谢您提前的帮助。
Y | K | L |
---|---|---|
26971.71 | 32.46371 | 3013256.014 |
330252.5 | 28.42238 | 135261574.9 |
127345.3 | 5.199048 | 39168414.92 |
3626843 | 327.807 | 1118363069 |
37192.73 | 16.01538 | 9621912.503 |
1) 尝试删除 A 并仅使用其他 2 个参数进行优化。然后使用结果作为起始值重新优化。在 nls 的第二个应用中,我们使用 plinear 算法,它不需要线性输入参数的起始值。当使用 plinear
时,右侧应该是一个矩阵,使得线性参数与每一列相乘。在这种情况下,我们只有一列。
fo <- Y ~ cbind(A = (K^Beta_1) * (L^Beta_2))
st <- list(Beta_1 = 2, Beta_2 = 2)
fm0 <- nls(fo, DF, start = st)
fm1 <- nls(fo, DF, start = coef(fm0), alg = "plinear"); fm1
给予:
Nonlinear regression model
model: Y ~ cbind(A = (K^Beta_1) * (L^Beta_2))
data: DF
Beta_1 Beta_2 .lin.A
0.25399 0.81422 0.03572
residual sum-of-squares: 2.468e+09
Number of iterations to convergence: 7
Achieved convergence tolerance: 6.56e-06
2) 如果我们取两边的对数,那么假设我们使用 log(A) 而不是 A 作为一个参数,则公式在所有参数中都是线性的,因此我们可以使用 lm
。请注意,这不是与原始问题完全等效的问题,尽管它对您来说可能足够接近。下面我们将其用作获取起始值的替代方法。
fm2 <- lm(log(Y) ~ log(K) + log(L), DF)
co2 <- coef(fm2)
st2 <- list(Beta_1 = co2[[2]], Beta_2 = co2[[3]])
fm3 <- nls(fo, DF, start = st2, alg = "plinear"); fm3
给予:
Nonlinear regression model
model: Y ~ cbind(A = (K^Beta_1) * (L^Beta_2))
data: DF
Beta_1 Beta_2 .lin.A
0.2540 0.8143 0.0357
residual sum-of-squares: 2.468e+09
Number of iterations to convergence: 6
Achieved convergence tolerance: 3.744e-06
备注
可重现形式的输入DF
是:
DF <- structure(list(Y = c(26971.71, 330252.5, 127345.3, 3626843, 37192.73
), K = c(32.46371, 28.42238, 5.199048, 327.807, 16.01538), L = c(3013256.014,
135261574.9, 39168414.92, 1118363069, 9621912.503)),
class = "data.frame", row.names = c(NA, -5L))