对于下面的示例数据框,我想对所有独特的DRUG-ADR组合执行统计测试(例如t检验)。为此,我需要以下内容:
1)每个独特的药物 - ADR组合的X向量
2)如果我的药物 - 感兴趣的ADR是D1 - A1,我想用矢量测试X的矢量(这里是34):
此过程应循环遍历数据框中的所有记录,并且应忽略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)
答案 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)
# 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)