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()
来创建统计错误)。
所以我的情况如下:我有一个大型数据框,其中包含我应该在匹配分析中使用的数据。但是,我应该匹配由某些区域定义的内部子组。因为我不想为每个子组(有太多)“手动”执行此操作,所以我想出了一种方法,将初始数据帧划分为包含每个独特处理区域和控制区域信息的子数据帧,并且将这些数据帧保存到列表中。在此之后,我使用 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()
来创建统计错误)。