使用gmm包估计正态分布尺度参数时遇参数缺失报错求助
解决gmm函数正态分布估计报错的方案
1. 错误原因分析
报错l'argument "x" est manquant, avec aucune valeur par défaut(x参数缺失,无默认值),核心问题是你定义的矩条件函数g0不符合gmm包的要求:
gmm要求矩函数必须以待估参数向量theta作为第一个参数,数据x作为第二个参数- 你的
g0要么没定义x参数,要么参数顺序搞反了,导致函数调用时无法拿到数据value_2020
2. 正确定义正态分布的矩条件函数
对于正态分布,恰好识别的矩条件对应一阶矩(均值)和二阶中心矩(方差),正确的g0写法如下:
# 恰好识别的矩条件函数:theta[1]是均值mu,theta[2]是方差sigma² g0 <- function(theta, x) { mu <- theta[1] sigma_sq <- theta[2] # 返回n×2的矩条件矩阵,每行对应一个样本的两个矩条件 cbind(x - mu, (x - mu)^2 - sigma_sq) }
注:这里直接估计方差
sigma²更稳妥,后续可通过开平方得到标准差。如果要直接估计标准差,矩条件需调整为(x - mu)^2 - theta[2]^2。
3. 修正后的gmm调用代码
确保value_2020是数值向量,然后调用gmm:
library(gmm) # 提取清理后的收入数值列(替换成你的实际列名) value_2020 <- your_clean_data$income_2020 # 初始值用样本统计量(远好于0,加快收敛) t0 <- c(mu = mean(value_2020), sigma_sq = var(value_2020)) # 调用gmm函数 res0 <- gmm(g0, value_2020, t0 = t0, wmatrix = "ident") print(res0)
4. 泊松分布拟合的参考代码
泊松分布的矩条件可基于一阶矩(均值=lambda)和二阶矩(E[X²] = lambda + lambda²),对应的矩函数和调用代码如下:
# 泊松分布矩条件函数:theta[1]是lambda g_pois <- function(theta, x) { lambda <- theta[1] cbind(x - lambda, x^2 - (lambda + lambda^2)) } # 估计泊松分布参数 res_pois <- gmm(g_pois, value_2020, t0 = c(lambda = mean(value_2020))) print(res_pois)
5. 拟合优度判断方法
对比两种分布的拟合效果可参考:
- 查看
gmm结果的J统计量:J值越小、p值越大,说明矩条件越满足,拟合效果越好 - 绘制数据直方图,叠加两种分布的概率密度曲线做直观对比
- 计算残差的均方误差等统计量
内容的提问来源于stack exchange,提问作者Maxime Delrèe
相关产品推荐
相关产品推荐

