在R中使用gmm包执行GMM时指定抽样权重的方法求助
在R的gmm包中加入抽样权重执行GMM估计
你遇到的核心问题是:gmm函数的weight参数不是用来指定观测抽样权重的,它的作用是设置GMM估计过程中的最优权重矩阵(比如两步GMM里的权重矩阵),所以直接传入数据框的weight列必然报错。
下面是两种可行的解决方案:
方法一:自定义加权矩条件(推荐,适用于所有场景)
抽样权重的本质是让每个观测对矩条件的贡献不同,所以我们可以手动构造加权后的矩条件函数,让每个观测的矩条件乘以对应的抽样权重。
完整代码
library(gmm) # 你的原始数据 df <- data.frame( y = c(1,0,1,1,1,0,0,1), x = c(20,12,13,15,19,21,10,12), weight = c(1,0.5,1,0.75,1,1,0.25,1) ) # 定义加权矩条件函数 weighted_moment_func <- function(theta, data) { # theta是待估计的系数:theta[1]是截距,theta[2]是x的系数 y <- data$y # 构造包含截距项的自变量矩阵 x_matrix <- cbind(1, data$x) # 抽样权重 w <- data$weight # 计算残差:y - 预测值 residuals <- y - x_matrix %*% theta # 生成加权后的矩条件:残差*权重*工具变量(这里工具变量和自变量一致) w * residuals * x_matrix } # 用OLS结果作为GMM的初始值(让估计收敛更稳定) ols_result <- lm(y ~ x, data = df) start_coef <- coef(ols_result) # 执行加权GMM weighted_gmm <- gmm(weighted_moment_func, x = df, t0 = start_coef) # 查看结果 summary(weighted_gmm)
说明
如果你的工具变量和自变量不同,只需要把函数里的x_matrix替换成你的工具变量矩阵即可,逻辑完全一致。
方法二:数据加权复制(仅适合小数据场景)
如果数据量不大,可以把每个观测按照抽样权重的比例复制(非整数权重可以先放大为整数),用复制后的数据集跑GMM。这种方法简单但不够严谨,适合快速验证:
# 把权重放大4倍转为整数(避免小数),然后重复行 df_weighted <- df[rep(seq(nrow(df)), round(df$weight * 4)), ] # 用复制后的数据集跑GMM gmm_replicated <- gmm(y ~ x, ~x, data = df_weighted) summary(gmm_replicated)
内容的提问来源于stack exchange,提问作者Hanifa Pilvar
相关产品推荐
相关产品推荐

