R中使用MLE和NLS函数估计非线性生产模型参数问题求助
NLS报错原因与解决
NLS报错是因为你设置的初始值不合理,生产函数的要素弹性通常位于0~1区间,你将Beta_1、Beta_2初始值设为2,代入数据后会出现极大值溢出,生成无穷值导致计算终止。
修复方法:调整初始值为合理区间数值,也可以先通过对数线性回归获取初始值再代入NLS计算,示例代码如下:
# 构造样本数据集 dat <- data.frame( 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) ) # 修正后的NLS估计 prod.nls <- nls(Y ~ A * (K^Beta_1) * (L^Beta_2), data = dat, start = list(A = 1, Beta_1 = 0.3, Beta_2 = 0.7)) # 查看估计结果 summary(prod.nls)
MLE报错原因与解决
你调用mle函数的语法错误,stats4包中的mle不支持直接传入公式进行拟合,需要先自定义负对数似然函数传入。
如果只是要估计对数转换后的线性模型,在误差项独立同分布服从正态分布的假设下,普通最小二乘估计结果和MLE完全一致,可以直接用lm函数拟合:
# 对数线性模型拟合 prod.loglm <- lm(log(Y) ~ log(K) + log(L), data = dat) summary(prod.loglm)
如果需要显式调用mle函数拟合,需要先构造负对数似然函数,示例代码如下:
library(stats4) # 自定义负对数似然函数 neg_loglik <- function(lnA, beta1, beta2, sigma) { mu <- lnA + beta1 * log(dat$K) + beta2 * log(dat$L) -sum(dnorm(log(dat$Y), mean = mu, sd = sigma, log = TRUE)) } # MLE估计 prod.mle <- mle(neg_loglik, start = list(lnA = 1, beta1 = 0.3, beta2 = 0.7, sigma = 0.1)) summary(prod.mle)
内容的提问来源于stack exchange,提问作者Warhawk1987
相关产品推荐
相关产品推荐

