2012-03-12 5 views
0

これはR: t-test over all columnsR:t検定すべてのサブセットを超えるすべての列の上に

からのフォローアップの質問ですが、私は巨大なデータセットを持って、その後、私は特定の条件に基づいて、多くのサブセットを作成したとします。サブセットの列数は同じでなければなりません。次に、私は一度に2つのサブセット(外側のループ)でt検定を行い、その後、各サブセットの組み合わせに対して、すべての列を一度に1列ずつ(内部ループ)調べます。

これまでの回答に基づいています。これはエラーで停止します。

C <- c("c1","c1","c1","c1","c1", 
    "c2","c2","c2","c2","c2", 
    "c3","c3","c3","c3","c3", 
    "c4","c4","c4","c4","c4", 
    "c5","c5","c5","c5","c5", 
    "c6","c6","c6","c6","c6", 
    "c7","c7","c7","c7","c7", 
    "c8","c8","c8","c8","c8", 
    "c9","c9","c9","c9","c9", 
    "c10","c10","c10","c10","c10") 
X <- rnorm(n=50, mean = 10, sd = 5) 
Y <- rnorm(n=50, mean = 15, sd = 6) 
Z <- rnorm(n=50, mean = 20, sd = 5) 
Data <- data.frame(C, X, Y, Z) 

Data.c1 = subset(Data, C == "c1",select=X:Z) 
Data.c2 = subset(Data, C == "c2",select=X:Z) 
Data.c3 = subset(Data, C == "c3",select=X:Z) 
Data.c4 = subset(Data, C == "c4",select=X:Z) 
Data.c5 = subset(Data, C == "c5",select=X:Z) 

Data.Subsets = c("Data.c1", 
       "Data.c2", 
       "Data.c3", 
       "Data.c4", 
       "Data.c5") 

library(plyr) 

combo1 <- combn(length(Data.Subsets),1) 
adply(combo1, 1, function(x) { 

    combo2 <- combn(ncol(Data.Subsets[x]),2) 
    adply(combo2, 2, function(y) { 

     test <- t.test(Data.Subsets[x][, y[1]], Data.Subsets[x][, y[2]], na.rm=TRUE) 

     out <- data.frame("Subset" = rownames(Data.Subsets[x]), 
        , "Row" = colnames(x)[y[1]] 
        , "Column" = colnames(x[y[2]]) 
        , "t.value" = round(test$statistic,3) 
        , "df"= test$parameter 
        , "p.value" = round(test$p.value, 3) 
        ) 
     return(out) 
    }) 
}) 
+0

'str(Data.Subsets)'を見てください。 – joran

+0

あなたのコードで何をしたいかは完全にはっきりしていません。 サブセット1のc1とサブセット2のc1の間にテストを実行した後、サブセット1のc2とサブセット2のc2などについてt検定を実行することを意味しますか? Data.Subsetsは単なる文字ベクトルです。実際には、作成したデータフレームサブセットは実際には含まれません。データフレームを扱い、コード文字列を渡したいからです。 –

+0

@DavyKavanagh:はい、Data.Subsetsは単なる文字ベクトルです。私はas.data.frameを使ってデータフレームに変換しようとしましたが、同じ結果が得られました。私がしたかったのは、これらのデータのサブセット名を取得し、ループ内の実際のデータサブセットにアクセスすることでした。適切な質問は、ループ内のパラメータとしてデータフレームを渡す方法ですか? – ery

答えて

4

まず第一に、あなたがより簡単にあなたがglを使用してデータセット、および列のための個々の変数を作成避けることによって定義することができます。

Data <- data.frame(
    C = gl(10, 5, labels = paste("c", 1:10, sep = "")), 
    X = rnorm(n = 50, mean = 10, sd = 5), 
    Y = rnorm(n = 50, mean = 15, sd = 6), 
    Z = rnorm(n = 50, mean = 20, sd = 5) 
) 

reshapeパッケージからmeltを使用して "長い" 形式にこれを変換します。 (また、ベースreshape関数を使用することができる。)

longData <- melt(Data, id.vars = "C") 

今ことC.

with(longData, pairwise.t.test(value, interaction(C, variable))) 

の各レベル注するためのX/Y/Zのすべてのペアにt検定を計算するpairwise.t.testを使用します多くのテストを実行する場合は、p値を調整する必要があるため、t.testへの個々の呼び出しの数だけでなく、pairwise.t.testを使用することが重要です。

一般に、ペアワイズt検定は回帰よりも劣るので、その使用法に注意してください。

1

get(Data.subset[x])を使用すると、関連するデータフレームを選択できます。しかし、私はこれが必要であるとは思わない。

明示的にサブセット化することは、何度も必要ではありません。あなたはそれを渡された諸条件にsubsetedデータフレーム毎のリストを返します(それをテストしていない)必要があります

conditions = c("c1", "c2", "c3", "c4", "c5") 
dfs <- lapply(conditions, function(x){subset(Data, C==x, select=X:Z)}) 

のようなものを使用して作成することができます。

しかし、@ Richie Cottonが指摘しているように、データフレームの形状を変更してpairwise tテストを使用すると、より良いアイデアになります。

この多くのt検定を行うことは賢明ではないと指摘しておきます。複数のテストのための訂正の後でさえ、それはFDR、順列またはそうでなければなりません。あなたが何らかの種類のanovaを使用することができるかどうかは、この目的のためにほぼ正確に使用されるので、試してみてください。

+0

ありがとう!上記の最初の答えを試してみましたが、うまくいきます。私は522 colsそれぞれ1522行を持っています。 C1〜C16の組み合わせでは、 "メモリが使い果たされました"と計算が失敗します。どのくらいの大きさの記憶が私に必要なのか? – ery

関連する問題