2012-03-12 12 views
0

這是R: t-test over all columnsR:t檢驗過的所有子集在所有列

假設一個跟進的問題,我有一個巨大的數據集,然後創建基於某些條件衆多的子集。子集應具有相同的列數。然後我想一次對兩個子集進行t檢驗(外部循環),然後對於每個子集的組合,一次一列地檢查所有列(內部循環)。

這是我根據以前的答案提出的。這一個停止了一個錯誤。

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 2012-03-12 15:39:43

+0

這不完全清楚你想要你的代碼做什麼。 您的意思是在子集1中的c1和子集2中的c1之間進行測試,然後在子集1中的c2和子集2中的c2上進行t檢驗? 快速瀏覽一下你的Data.Subsets只是一個字符向量。它實際上並不包含你所做的任何數據框子集。因此使用循環來完成任何操作都不會產生任何效果,因爲您想要處理數據框並且您正在傳遞代碼字符串。 – 2012-03-12 15:58:58

+0

@DavyKavanagh:是的,Data.Subsets只是一個字符向量。我試圖使用as.data.frame將其轉換爲數據框,但結果相同。我想要做的是:捕獲這些數據子集名稱,並訪問循環中的實際數據子集。我猜想相關的問題是:如何將數據幀作爲循環中的參數傳遞? – ery 2012-03-12 16:24:13

回答

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) 
) 

轉換此使用meltreshape包 「長」 格式。 (您也可以使用基本reshape功能。)

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

現在使用pairwise.t.test計算上所有對X/Y/Z的t檢驗爲C.

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

注意每個級別使用pairwise.t.test非常重要,因爲如果您運行大量測試,您需要調整p值,而不是單獨調用t.test。 (例如,請參閱xkcd的說明。)

通常,成對t檢驗不如迴歸,所以要小心它們的用法。

1

您可以使用get(Data.subset[x])來挑選出相關的數據框。但我認爲這不是必要的。

顯式子集多次也不應該是必要的。你可以使用類似

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

這應該(沒有測試)返回的子集的你通過它的各種條件的數據幀,每幀列表創建它們。

然而,@Richie Cotton指出,重塑你的數據框並使用成對t檢驗會更好。

我應該指出,做很多t檢驗似乎並不明智。即使經過多次測試校正之後,無論是FDR,排列還是其他方式。最好試着弄清楚你是否可以使用某種類型的anova,因爲它們幾乎就是用於這個目的。

+0

謝謝!我嘗試了上面的第一個答案,它工作得很好......有點。我有522列,每列1522行。使用C1到C16的組合,計算在「內存耗盡」上失敗。任何想法我需要多大的內存? – ery 2012-03-12 23:39:37