0

我有一个包含 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 [匹配行] 的单行。

必须满足以下2个条件:

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”的行,例如所有男性中风患者!关于从哪里开始的任何指导?年龄和性别匹配在医学研究中很常见,其他人将从任何帮助中受益。

4

2 回答 2

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)

该结果可以转换为 R data.framedo.call(rbind,res))

3岁以内只有一次中风,没有比赛。我确实在一个更大的样本上用一些可用的匹配对其进行了测试,它确实成功了,....但请注意方法上的建议,如果这是在分析阶段,请避免匹配。不必要地使用匹配会浪费宝贵的数据,并且通常是统计上的不当行为。如果医学科学的进步可能取决于此,最好获得经验丰富的统计咨询。

于 2013-07-24T23:59:29.687 回答
0

尝试在e1701包上使用matchControls函数。

于 2013-07-26T09:27:28.023 回答