Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 数据帧中唯一组合的统计测试_R_Testing_Dataframe - Fatal编程技术网

R 数据帧中唯一组合的统计测试

R 数据帧中唯一组合的统计测试,r,testing,dataframe,R,Testing,Dataframe,对于下面的示例数据框,我想对所有独特的药物-ADR组合进行统计测试(如t-test)。为此,我需要以下几点: 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可以有多个药物-不良反应组合。显然,我的数据集要大得多,从X得到的向量将包含超过1

对于下面的示例数据框,我想对所有独特的药物-ADR组合进行统计测试(如t-test)。为此,我需要以下几点:

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可以有多个药物-不良反应组合。显然,我的数据集要大得多,从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

dat你可以试试这样的东西
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)
对于循环,你可以试试这个。如果小组观察太少,将被中断,并将向您提供所有结果的列表。否则你可以用
t.test()p.value
只报告p值

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)

res查看
pairwise.t.test
。然后查看如何实现
pairwise.t.test
,并更改相应的行。您是否可以在问题中包含一个绘图,以显示您实际要比较的组,例如使用
boxplot()
函数。对于我来说,目前还不清楚。请参阅问题中的补充信息我对函数的使用经验很少,但如果我是正确的,我必须使用ifelse语句手动分配组。这几乎是不可能的,因为我有大约1500种药物和3000种不良反应。你有解决这个问题的办法吗?让事情变得更复杂:我需要表格中测试的p值以及药物和ADR列。一个有4列的表格:药物,ADR,pvalue1,pvalue2。我想差不多了。直到现在我才收到消息“t.test.formula(dat$TTO~group1)中的错误:分组因子必须正好有两个级别”。我想这与NAs有关。如果group1/group2是单独的对象,我可以删除NAs,但我不知道如何在函数中执行。知道如何确保有两个级别吗?如果我运行您的建议,我会得到group1和group2的一个大系数(这似乎是可以的),但对于g1和g2,我会得到一个大字符。基本上,它将D和A的所有值粘贴在一起,因此D1_vs_A1_vs_D1_vs_A2_vs_D1_vs_A3等。这对于组1和组2都是如此,乍一看它们似乎是相同的。因此,res1和res2返回NA作为结果
# for the test you can try following:
t.test(dat$X ~ group1)
t.test(dat$X ~ group2)
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)