MatchIt 与 lapply() 相结合:eval(object$call$data, envir = env) 出错:找不到对象 'x'

MatchIt combined with lapply(): Error in eval(object$call$data, envir = env) : object 'x' not found

所以我的情况如下:我有一个大型数据框,其中包含我应该在匹配分析中使用的数据。但是,我应该匹配由某些区域定义的内部子组。因为我不想为每个子组(有太多)“手动”执行此操作,所以我想出了一种方法,将初始数据帧划分为包含每个独特处理区域和控制区域信息的子数据帧,并且将这些数据帧保存到列表中。在此之后,我使用 R 的 MatchIt 包中的 matchit 函数对列表中的数据帧进行了匹配。这里有一个 高度简化的 数据帧列表示例:

> list_df
$A
   name treatment     cov1     cov2 cov3       var
1     A         1 13.65933 200.5809   13 1000.1185
2     A         1 15.80334 233.8301   13 1010.1038
3     A         1 15.16098 215.1046   13  999.8548
4     A         1 16.45487 185.4957   13  997.5585
5     A         1 15.55230 193.5955   13 1001.2822
9     U         0 16.33895 175.6502   13  999.0682
10    U         0 18.05787 197.6041   13 1003.2781
11    U         0 14.29088 229.5446   13 1002.9567
12    U         0 16.32195 238.9975   13  998.9453
13    U         0 15.25240 217.5467   13 1004.0581
14    U         0 14.69154 219.9963   13  999.3270
15    U         0 14.88606 153.6038   15  989.6423
16    U         0 14.34472 212.5205   15  994.6094
17    U         0 14.66233 231.1179   15  999.7775
18    U         0 14.69155 240.4084   15  994.9280
19    U         0 15.63663 198.3323   10 1007.4225
20    U         0 15.19980 183.5846   10  997.6229

$B
   name treatment     cov1     cov2 cov3       var
6     B         1 15.66004 187.1542   15 1004.2311
7     B         1 13.89696 197.5548   15  995.6478
8     B         1 16.17403 204.9423   15 1001.5157
9     U         0 16.33895 175.6502   13  999.0682
10    U         0 18.05787 197.6041   13 1003.2781
11    U         0 14.29088 229.5446   13 1002.9567
12    U         0 16.32195 238.9975   13  998.9453
13    U         0 15.25240 217.5467   13 1004.0581
14    U         0 14.69154 219.9963   13  999.3270
15    U         0 14.88606 153.6038   15  989.6423
16    U         0 14.34472 212.5205   15  994.6094
17    U         0 14.66233 231.1179   15  999.7775
18    U         0 14.69155 240.4084   15  994.9280
19    U         0 15.63663 198.3323   10 1007.4225
20    U         0 15.19980 183.5846   10  997.6229

在实际数据中,我有七个协变量,其中两个使用精确方法匹配。

此处为匹配组合 matchit(与马氏距离)和 lapply:

的代码
library(MatchIt)

m_obj_Mah <- lapply(area_list,
                    function(x){
                                matchit(Treatment ~ Cov1 + Cov2 + Cov3 + Cov4 + Cov5, 
                                data=x, method="nearest", exact = ~ Cov6 + Cov7, distance="mahalanobis")
                               }
                   )

在上面的代码中,一切正常。但是,当我尝试提取匹配的数据集时,出现错误:

m_data_Mah <- lapply(m_obj_Mah,
              function(x) {match.data(x)})

Error in eval(object$call$data, envir = env) : object 'x' not found

这里最奇怪的是,我使用相同的方法在同一数据集中使用卡尺进行最近邻倾向得分匹配,但没有出现错误。该错误显然与使用 x 作为 lapply 中每个 df 的名称定义函数有关,但我无法提出解决方案(以另一种方式循环遍历区域或在中定义 x lapply 有点不同)。有什么建议吗?

抱歉,我没有提供任何数据。生成真实的数据集会非常复杂,我无法共享原始数据集。如果绝对必要,我可以尝试提出某种虚拟数据集。

请参阅此 issue, which asks the same question, and the documentation for match.data(),它回答了它(请参阅 data 参数)。

这是 match.data() 的固有限制,但解决方案很简单并记录在案:将原始数据集提供给 match.data()data 参数,如下所示:

m_data_Mah <- lapply(seq_along(area_list), function(i) {
   match.data(m_obj_Mah[[i]], data = area_list[[i]])}

如果您使用的是 MatchIt 的 4.2.0 或更高版本,使用 exact 将自动匹配完全匹配变量的子组(即,它将在每个子组中执行单独的匹配过程) 使用 method = "nearest" 时。设置 verbose = TRUE 将显示当前正在匹配的级别。您还可以使用新的 rbind() 方法将匹配的数据集组合在一起(在旧版本中,您将使用 rbind() 来创建统计错误)。