R 数据帧中唯一组合的统计测试
对于下面的示例数据框,我想对所有独特的药物-ADR组合进行统计测试(如t-test)。为此,我需要以下几点: 1) 每个独特药物-ADR组合的X载体 2) 如果我感兴趣的药物-ADR是D1-A1,我想用以下载体测试X的载体(这里是34):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
- D1-非A1的所有A(在示例D1-A2中,x=37)
- A1-非D1的所有D(在示例D4-A1中,x=65)
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)