如何计算R中矩阵中所有条件对的相对风险?

时间:2017-03-07 07:08:40

标签: r statistics vectorization

我在R中有一个数据框,其中每一行都是一个人,每列都是疾病代码。每个细胞包含1或0以指示个体是否患有该疾病。对于每个疾病代码X,我想将患有疾病X的个体与没有疾病X的个体分开。然后我想计算患有疾病X的患者也患有疾病Y或疾病Z的相对风险。这里是样本数据和我的方法:

# generate reproducible dataframe with disease diagnoses
set.seed(2)
ID = c(0:19)
disease0 = c(rbinom(10, 1, 0.0), rbinom(10, 1, 1.0))
disease1 = c(rbinom(10, 1, 0.1), rbinom(10, 1, 0.9))
disease2 = c(rbinom(10, 1, 0.5), rbinom(10, 1, 0.5))
disease3 = c(rbinom(10, 1, 0.9), rbinom(10, 1, 0.1))
disease4 = c(rbinom(10, 1, 1.0), rbinom(10, 1, 0.0))
(disease.df = data.frame(cbind(ID, disease0, disease1, disease2, disease3, disease4)))
row.names(disease.df) = disease.df[ ,1]
disease.df[ ,1] = NULL
disease.df

   disease0 disease1 disease2 disease3 disease4
0         0        0        1        0        1
1         0        0        0        1        1
2         0        0        1        1        1
3         0        0        0        1        1
4         0        1        0        0        1
5         0        1        0        1        1
6         0        0        0        0        1
7         0        0        0        1        1
8         0        0        1        1        1
9         0        0        0        1        1
10        1        1        0        0        0
11        1        1        0        0        0
12        1        1        1        0        0
13        1        1        1        1        0
14        1        1        1        0        0
15        1        1        1        0        0
16        1        0        1        0        0
17        1        1        0        1        0
18        1        1        1        0        0
19        1        1        0        0        0

我可以使用以下代码来计算患病0的人患有1至4疾病的相对风险。

colMeans(filter(disease.df, disease0 == 1))/colMeans(filter(disease.df, disease0 != 1))

 disease0  disease1  disease2  disease3  disease4 
      Inf 4.5000000 2.0000000 0.2857143 0.0000000 

我的问题是,有没有办法使用矢量化操作或应用函数来为所有5种疾病执行此操作,同时避免使用for循环。理想情况下,它希望生成这样的表:

         disease0  disease1  disease2  disease3  disease4
diease0       Inf 4.5000000 2.0000000 0.2857143 0.0000000
diease1 7.3636364       Inf 1.0227273 0.4090909 0.2045455
diease2 1.8333333 1.0185185       Inf 0.6111111 0.5238095
diease3 0.3055556 0.4583333 0.6111111       Inf 2.8518519
diease4 0.0000000 0.2222222 0.5000000 3.5000000       Inf

1 个答案:

答案 0 :(得分:1)

不是最佳解决方案,但它可以帮助您处理重复的代码行。

t(apply(df[-1], 2, function(x) {
   temp = lapply(split(df[-1], x), colMeans)
  temp[[2]]/temp[[1]]
 })
)

#          disease0  disease1  disease2  disease3  disease4
#disease0       Inf 4.5000000 2.0000000 0.2857143 0.0000000
#disease1 7.3636364       Inf 1.0227273 0.4090909 0.2045455
#disease2 1.8333333 1.0185185       Inf 0.6111111 0.5238095
#disease3 0.3055556 0.4583333 0.6111111       Inf 2.8518519
#disease4 0.0000000 0.2222222 0.5000000 3.5000000       Inf

如果我理解正确,我们可以通过applylapply电话的组合来完成此操作。

对于每一列我们split两个部分(具有1和0的那些)的数据帧,并使用colMeans找到每列的均值,并按元素划分两个子列表。