如何解决理解 R
我正在尝试使用贪婪匹配进行我的第一个匹配对分析。我一直在关注 Coursera 课程示例,但我不确定我是否应该对匹配结果感到满意。
这是我为贪婪匹配而运行的:
library(Matching)
set.seed(123)
n = 1500
id <- 1:n
score <- rnorm(n,mean=.5,sd=.13)
location <- sample(c("A","B"),n,replace=TRUE)
treatment <- rep(0,n)
tr_subset <- sample(n,n*.1)
treatment[tr_subset] = 1
outcome <- rep(0,n)
ot_subset <- sample(n,n*.63)
outcome[ot_subset] = 1
data_set <- data.frame(id,location,score,treatment,outcome)
#prepare for matching
loc_a <- as.numeric(location =="A")
loc_b <- as.numeric(location =="B")
prematch <- cbind(loc_a,loc_b,outcome)
prematch <- data.frame(prematch)
#variables that will be used for matching
xvars<-c("loc_a","loc_b","score")
#greedy matching
greedymatch<-Match(Tr=treatment,M=1,X=prematch[xvars])
matched<-
prematch[unlist(greedymatch[c("index.treated","index.control")]),]
我遇到了以下“问题”。
- 即使我设置了 M=1,我也会得到多个匹配到 1 个处理的结果。例如,这里有一个匹配 4 个控件:
治疗
loc_a | loc_b | 得分 | 治疗 | 结果 | |
---|---|---|---|---|---|
282 | 1 | 0 | .544612 | 1 | 0 |
282.1 | 1 | 0 | .544612 | 1 | 0 |
282.2 | 1 | 0 | .544612 | 1 | 0 |
282.3 | 1 | 0 | .544612 | 1 | 0 |
控制
loc_a | loc_b | 得分 | 治疗 | 结果 | |
---|---|---|---|---|---|
760 | 1 | 0 | .545 | 0 | 1 |
1045 | 1 | 0 | .545014 | 0 | 1 |
1060 | 1 | 0 | .544711 | 0 | 0 |
1241 | 1 | 0 | .544997 | 0 | 1 |
- 此外,如果处理与多个对照匹配,它会创建处理的多个重复行(见上文)
- 对照组中的一些人与治疗组中的多个人匹配:
治疗
loc_a | loc_b | 得分 | 治疗 | 结果 | |
---|---|---|---|---|---|
644 | 1 | 0 | .480298 | 1 | 0 |
1139 | 1 | 0 | .480262 | 1 | 0 |
1206.1 | 1 | 0 | .48056 | 1 | 0 |
1218.1 | 1 | 0 | .480588 | 1 | 0 |
控制
loc_a | loc_b | 得分 | 治疗 | 结果 | |
---|---|---|---|---|---|
1404 | 1 | 0 | .48038 | 0 | 1 |
1404.1 | 1 | 0 | .48038 | 0 | 1 |
1404.2 | 1 | 0 | .48038 | 0 | 1 |
1404.3 | 1 | 0 | .48038 | 0 | 1 |
这些问题是我需要解决的问题还是贪婪匹配工作原理的一部分?
我很难找到在 R 中使用 Matched() 进行贪婪匹配的好例子。您还知道一般贪婪匹配的任何好资源吗?
解决方法
这是因为 Match()
中有几个默认值。
第一种情况是由于 distance.tolerance
和 ties
参数给 Match()
。默认情况下,distance.tolerance
为 1e-5
,这意味着距离处理单元 1e-5
或更短距离内的任何控制单元都将被视为与处理单元等距。因此,例如,控制单元 760、1045、1060 和 1241 都在处理单元 282 的 1e-5
内。由于 ties
参数默认为 TRUE
,因此将包括任何关系在比赛中。在这里,这四个控制单元是绑定的,因此它们都与处理过的单元匹配(并且每对的权重为 0.25)。为了防止这种情况发生,您可以设置 ties = FALSE
,在这种情况下,将选择一个控制单元与每个处理过的单元相匹配。设置 distance.tolerance = 0
还可以确保尊重距离之间的任何差异,而不是四舍五入为零。
第二种情况是由于 replace
参数,默认情况下为 TRUE
,因此执行匹配替换。这意味着每个控制单元可以与多个处理单元匹配,如果它与这些处理单元最接近。要在不替换的情况下执行匹配(这似乎是您想要的),请设置 replace = FALSE
。
请注意,Matching
并不是唯一进行贪婪匹配的包; MatchIt
也可以,并且具有符合您期望的默认值,尽管并非所有选项都可用。例如,默认情况下,Matching::Match()
执行欧几里德距离匹配,而 MatchIt::matchit()
中的默认值是倾向得分匹配。 MatchIt
中的欧几里得距离匹配需要一些额外的编程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。