5

TL;DRエディション

ベクトルX1、X2、X3、...Xnがあります。考えられるすべてのベクトルの組み合わせについて、あるベクトルの平均値が他のベクトルの平均値と大幅に異なるかどうかをテストしたいと思います。n ^ 2個のt.testを実行するよりも、Rでこれを行うためのより良い方法を探しています。

フルストーリー

特定のCSAの人口調査データでいっぱいのデータフレームがあります。各行には、特定の国勢調査区の各変数(列)の観測値が含まれています。

私がする必要があるのは、異なるMSAの国勢調査区全体で同じ変数の平均を比較することです。つまり、MSA指定変数(列の1つ)に従ってdata.frameを因数分解し、次に、新しく因数分解された各MSA間でペアごとに別の対象変数の平均の差を比較します。これは基本的に、後続の各ベクトルでペアワイズt.testを実行しますが、t.test(MSAx、MSAy)を何度も記述するよりも、より洗練された方法でこれを実行したいと思います。これどうやってするの?

4

4 に答える 4

8

@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. ")
于 2013-02-07T07:58:10.923 に答える
4

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')
于 2013-02-07T01:22:54.007 に答える