如何在R中跨多个独立向量执行成对t.test?

时间:2013-02-07 00:24:53

标签: r

TL; DR版

我有矢量X1,X2,X3,... Xn。我想测试一下,对于每个可能的向量组合,任何一个向量的平均值是否与任何其他向量的平均值显着不同。我正在寻找一种更好的方法在R中执行此操作,而不是运行n ^ 2个人t.tests。

全文

我的数据框中充满了特定CSA的人口普查数据。每行包含特定人口普查区域的每个变量(列)的观察结果。

我需要做的是比较不同MSA中人口普查区域内相同变量的均值。换句话说,我想根据MSA指定变量(其中一列)对我的data.frame进行因子分析,然后在每个新分解的MSA上成对地比较另一个感兴趣变量的均值差异。这基本上是在每个随后的向量上进行成对t.tests,但我希望以比一次又一次写t.test(MSAx,MSAy)更优雅的方式做到这一点。我怎么能这样做?

4 个答案:

答案 0 :(得分:6)

只需使用pairwise.t.test,这是一个例子:

x1 <- rnorm(50)
x2 <- rnorm(30, mean=0.2)
x3 <- rnorm(100,mean=0.1)
x4 <- rnorm(100,mean=0.4)

x <- data.frame(data=c(x1,x2,x3,x4),
                key=c(
                  rep("x1", length(x1)),
                  rep("x2", length(x2)),
                  rep("x3", length(x3)),
                  rep("x4", length(x4))) )

pairwise.t.test(x$data,
                x$key,
                pool.sd=FALSE)

#   Pairwise comparisons using t tests with non-pooled SD 
#
# data:  x$data and x$key 
#
#    x1     x2     x3    
# x2 0.7395 -      -     
# x3 0.9633 0.9633 -     
# x4 0.0067 0.9633 0.0121
#
# P value adjustment method: holm 

答案 1 :(得分:5)

我的方法下面对@ashkan提出的方法的优点是我的删除重复项。 (即X1与X2或X2对比X1将出现在结果中,而不是两者)

# Generate dummy data
df <- data.frame(matrix(rnorm(100), ncol = 10))
colnames(df) <- paste0("X", 1:10)

# Create combinations of the variables
combinations <- combn(colnames(df),2, simplify = FALSE)

# Do the t.test
results <- lapply(seq_along(combinations), function (n) {
                  df <- df[,colnames(df) %in% unlist(combinations[n])]
                  result <- t.test(df[,1], df[,2])
                  return(result)})

# Rename list for legibility    
names(results) <- paste(matrix(unlist(combinations), ncol = 2, byrow = TRUE)[,1], matrix(unlist(combinations), ncol = 2, byrow = TRUE)[,2], sep = " vs. ")

答案 2 :(得分:3)

如果您有data.frame并且希望在data.frame的每一列之间独立执行T检验,则可以使用双应用循环:

apply(MSA, 2, function(x1) {
  apply(MSA, 2, function(x2) {
    t.test(x1, x2)
  })
})

伴随这种蛮力方法的良好可视化将是森林情节:

cis <- apply(MSA, 2, function(x) mean(x) + c(-1, 1) * sd(x) * 1.96)
plot.new()
plot.window(xlim=c(1, ncol(cis)), ylim=range(cis))
segments(1:ncol(cis), cis[1, ], 1:ncol(cis), cis[2, ])
axis(1, at=1:ncol(cis), labels=colnames(MSA))
axis(2)
box()
abline(h=mean(MSA), lty='dashed')
title('Forest plot of 95% confidence intervals of MSA')

答案 3 :(得分:0)

除了来自 quarzgar 的响应之外,还有另一种方法可以在 R 中对多个因子执行成对 ttest。基本上是通过创建因子水平组合使用的两个(或多个)因子的技巧。

2x2 经典设计示例:

df <- data.frame(Id=c(rep(1:100,2),rep(101:200,2)),
               dv=c(rnorm(100,10,5),rnorm(100,20,7),rnorm(100,11,5),rnorm(100,12,6)),
             Group=c(rep("Experimental",200),rep("Control",200)),
             Condition=rep(c(rep("Pre",100),rep("Post",100)),2))

#ANOVA
summary(aov(dv~Group*Condition+Error(Id/Condition),data = df))

#post-hoc across all factors
df$posthoclevels <- paste(df$Group,df$Condition) #factor combination
pairwise.t.test(df$dv,df$posthoclevels)

#   Pairwise comparisons using t tests with pooled SD 
#
# data:  df$dv and df$posthoclevels 
#
#                 Control Post Control Pre Experimental Post
# Control Pre       0.60         -           -                
# Experimental Post <2e-16       <2e-16      -                
# Experimental Pre  0.26         0.47        <2e-16           
#
# P value adjustment method: holm