R中如何实现跨多个不同lm模型的系数线性组合与检验
解决方案
方法原理
multcomp包的glht函数支持直接传入系数向量和协方差矩阵完成检验,无需依赖原始模型对象,因此只需完成两步核心操作:
- 将多个模型的系数拼接为命名一致的长向量
- 构造对应维度的联合协方差矩阵
实现步骤
场景1:多模型基于同一样本拟合(仅被解释变量不同,如示例场景)
直接使用estimatr的多输出回归接口一次性拟合所有模型,自动生成联合系数和联合协方差矩阵,无需手动拼接:
# 多输出回归拟合,同时得到三个被解释变量的回归结果 lm_joint <- lm_robust( formula = cbind(y1, y2, y3) ~ x + z, data = df, subset = x>10 & x<90, clusters = id ) # 提取联合系数与联合协方差矩阵 coef_joint <- coef(lm_joint) vcov_joint <- vcov(lm_joint) # 构造跨模型线性组合检验 library(multcomp) test_res <- glht( model = NULL, linfct = "0.1*`y1:z` + 0.4*`y2:z` + 0.2*`y3:z` = 0", coef = coef_joint, vcov = vcov_joint ) # 输出检验结果 summary(test_res)
多输出回归生成的系数命名规则为被解释变量名:自变量名,使用时注意用反引号包裹特殊名称即可。
场景2:多模型基于独立样本拟合
此时跨模型的系数协方差为0,直接构造块对角协方差矩阵即可:
library(Matrix) # 拼接所有模型的系数,添加模型前缀避免命名冲突 coef_joint <- c( setNames(coef(lm1), paste0("lm1_", names(coef(lm1)))), setNames(coef(lm2), paste0("lm2_", names(coef(lm2)))), setNames(coef(lm3), paste0("lm3_", names(coef(lm3)))) ) # 构造块对角联合协方差矩阵 vcov_joint <- as.matrix(bdiag(vcov(lm1), vcov(lm2), vcov(lm3))) rownames(vcov_joint) <- colnames(vcov_joint) <- names(coef_joint) # 执行检验 test_res <- glht( model = NULL, linfct = "0.1*lm1_z + 0.4*lm2_z + 0.2*lm3_z = 0", coef = coef_joint, vcov = vcov_joint ) summary(test_res)
补充说明
如果多模型为同一样本但自变量/样本筛选规则不同,需要计算跨模型系数协方差的,可以使用systemfit包拟合SUR模型并计算聚类稳健标准误,提取联合系数和协方差矩阵后按上述逻辑传入glht即可。
内容的提问来源于stack exchange,提问作者ZAVIM
相关产品推荐
相关产品推荐

