我的数据框有2,130个观察结果:130名中风患者和2,000名心脏病发作(MI)患者。
Index Age Sex Stroke MI
1 42 M FALSE TRUE
2 76 M FALSE TRUE
3 55 F FALSE TRUE
4 80 M TRUE FALSE
5 68 F FALSE TRUE
str(Match)
'data.frame': 2130 obs. of 5 variables:
$ Index : int 1 2 3 4 5 6 7 8 9 10 ...
$ Gender: Factor w/ 2 levels "F","M": 2 1 1 1 2 1 1 2 2 1 ...
$ Age : num 45.8 44.1 67.7 37.4 46.7 72 21.4 50.8 35.8 47.2 ...
$ Stroke: logi TRUE TRUE TRUE TRUE TRUE TRUE ...
$ MI : logi FALSE FALSE FALSE FALSE FALSE FALSE ...
对于Stroke = TRUE [测试行]的每一行,我需要一行,其中MI = TRUE [匹配的行]。
必须满足以下两个条件:
Sex in [matched row] = Sex in [test row]
Age in [matched row] equal to or within +/- 3 years of Age in [test row]
如果选择了一行进行匹配,则无法再次使用该行。由于要匹配130个击球,输出应包含130次心脏病发作。有足够的心脏病发作可供选择。在极少数情况下无法找到130,尽可能多地匹配。
我刚刚开始学习R(并且没有编程背景),我的尝试仅限于找到具有'which'和'subset'的行,例如所有男性中风患者!有关从哪里开始的任何指导?年龄和性别匹配在医学研究中很常见,其他人将从任何帮助中受益。
答案 0 :(得分:3)
您的数据不适合任何测试,因为没有一个值具有可接受的匹配。我只是提供这样的机会,因为您没有处于分析阶段,而是处于设计阶段,您需要选择适当的控制,因为注册会产生额外的成本。
str(dfrm4)
'data.frame': 15 obs. of 5 variables:
$ Index : int 1 2 3 4 5
$ Age : int 42 76 55 80 68
$ Sex : Factor w/ 2 levels "F","M": 2 2 1 2 1
$ Stroke: logi FALSE FALSE FALSE TRUE FALSE
$ MI : logi TRUE TRUE TRUE FALSE TRUE
#----------------
apply(dfrm4[ dfrm4$Stroke, ] , 1, function(m) {
possm <- dfrm4[!dfrm4$Stroke &
as.character(dfrm4$Sex)==m['Sex'] &
as.character(dfrm4$Index) != m['Index'] &
dfrm4$Age >= as.numeric(m['Age']) -3 &
dfrm4$Age <= as.numeric(m['Age']) +3, ];
N <- NROW(possm)
return(possm[ sample(1:N, 1), ] ) })
# --------------
$`4`
[1] Index Age Sex Stroke MI
<0 rows> (or 0-length row.names)
该结果可以转换为带有do.call(rbind,res))
3岁以内只有一次中风和没有比赛。我确实在一个更大的样本上测试了一些可用的匹配,但它确实成功了......但是如果这是在分析阶段,请注意方法建议并避免匹配。不必要地使用匹配是浪费有价值的数据,并且通常是统计上的不当行为。如果医学科学的进步可能取决于此,那么最好是进行有经验的统计咨询。
答案 1 :(得分:0)
尝试在e1701包上使用matchControls
功能。