You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:13:17