来自数据框的独特组合的统计测试

时间:2017-03-02 09:51:03

标签: r testing dataframe

对于下面的示例数据框,我想对所有独特的DRUG-ADR组合执行统计测试(例如t检验)。为此,我需要以下内容:

1)每个独特的药物 - ADR组合的X向量

2)如果我的药物 - 感兴趣的ADR是D1 - A1,我想用矢量测试X的矢量(这里是34):

  • D1 - 所有不是A1的A(在示例D1-A2中,x = 37)
  • A1 - 所有不是D1的D(在例子D4-A1中,x = 65)

此过程应循环遍历数据框中的所有记录,并且应忽略ID变量,因为一个ID可以具有多个DRUG-ADR组合。显然,我的数据集要大得多,而来自X的结果向量将包含多于1个值

dat <- data.frame(ID=c(1,2,3,4,4,4,5,6,6,7),
                  DRUG=c("D1","D2","D2","D3","D3","D3","D5","D1","D4","D2"),
                  ADR=c("A1","A2","A3","A6","A7","A8","A4","A2","A1","A2"),
                  X=c(34,76,34,45,2,41,56,37,65,12))


   ID DRUG ADR  X
1   1   D1  A1 34
2   2   D2  A2 76
3   3   D2  A3 34
4   4   D3  A6 45
5   4   D3  A7  2
6   4   D3  A8 41
7   5   D5  A4 56
8   6   D1  A2 37
9   6   D4  A1 65
10  7   D2  A2 12

期待您的建议!

其他信息: 我无法用boxplot()解释这个,所以我会口头尝试。在这个例子中,我想为DRUG-ADR的每个独特组合执行X的2次测试。因此,对于D1-A1,我想测试D1-A&lt;&gt; 1和D&lt;&gt; -1-A1。对于测试编号1,我需要两个向量:一个包含D1-A1的X值(这里是34),另一个包含D1的值-A&lt;&gt; 1(所以在这种情况下D1-A2(值= 37),但在我更大的数据集中,这将是一个更大的向量,包含例如D1-A23,D1-A573等的值。对于测试编号2,我需要X的D1-A1(我已经从测试1获得)和D 1-A1(这里是D4-A1,值= 65)的矢量。然后应对记录2(D2-A2),记录3(D2-A3)等重复相同的过程。因此,对于数据帧中的每个记录,我需要来自X的2组2个向量。

接下来将是记录2.对于该记录,D2-A2的矢量将是(76,12),而D&lt; 2-A2的矢量将是(37;来自记录8)和矢量D2-A&lt;&gt; 2将是(34;来自记录3)。我希望这能解释它

补充评论:下面的语法决定了D1-A1的2个测试。但是,我想要一个通用函数循环遍历所有唯一的Dx-Ax组合并执行相同的过程(因此在这种情况下,9次2次测试,因为记录2和10适用于相同的组合)。

x <- ifelse (dat$DRUG == "D1" & dat$ADR == "A1",dat$X, NA)
x <- x[!is.na(x)]

y <- ifelse (dat$DRUG != "D1" & dat$ADR == "A1",dat$X, NA)
y <- y[!is.na(y)]

z <- ifelse (dat$DRUG == "D1" & dat$ADR != "A1",dat$X, NA)
z <- z[!is.na(z)]

t.test(x,y)
t.test(x,z)

1 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情。 ifelse非常适合分组

group1 <- ifelse(dat$DRUG == "D1", ifelse(dat$ADR  == "A1", 1, 2), NA)
group2 <- ifelse(dat$ADR == "A1", ifelse(dat$DRUG  == "D1", 1, 2), NA)
par(mfrow=c(1,2))
boxplot(dat$X ~ group1)
boxplot(dat$X ~ group2)

enter image description here

# for the test you can try following:
t.test(dat$X ~ group1)
t.test(dat$X ~ group2)

对于循环,你可以尝试这个。如果群体观察太少,将会中断,并会给出所有结果的列表。否则你可以使用 t.test()p.value仅报告pvalues。

res <- list()
n <- 2 # change here the number of tests
for (x in 1:n){
  D <- paste0("D", x)
  A <- paste0("A", x)
  group1 <- factor(ifelse(dat$DRUG == D, ifelse(dat$ADR  == A, paste0(D,A), paste0(D,"Ax")), NA))
  group2 <- factor(ifelse(dat$ADR == A, ifelse(dat$DRUG  == D, paste0(D,A),  paste0("Dx",A)), NA))
  g1 <- paste0(levels(group1), collapse = "_vs_")
  g2 <- paste0(levels(group2), collapse = "_vs_")
  if(nlevels(group1) == 2){
    res1 <- t.test(dat$X ~ group1)$p.value
  }else{
    res1 <- NA
  }
  if(nlevels(group2) == 2){
    res2 <- t.test(dat$X ~ group2)$p.value
  }else{
    res2 <- NA
  }
  res[[x]] <- cbind.data.frame(g1, res1, g2, res2)
}
do.call("rbind", res)