2014-12-05 111 views
1

中所有列(可能較大)矩陣中的p值是否有更有效/更快的方式來比較兩個矩陣(逐列),並使用t檢驗計算p值以獲得無差異意味着(必要時最終切換到chisq.test)?計算R

這裏是我的解決方案:

## generate fake data (e.g., from treatment and control data) 
z0 <- matrix(rnorm(100),10,10) 
z1 <- matrix(rnorm(100, mean=1.1, sd=2),10,10) 

## function to compare columns (bloody for loop) 
compare.matrix <- function(z0, z1){ 
    pval <- numeric(ncol(z0)) ## initialize 

    for(i in 1:ncol(z0)){ ## compare columns 
    pval[i] <- t.test(z1[, i], z0[, i])$p.value 

    ## if var is categorical, switch test type 
    if (length(unique(z1[,i]))==2){ 
     index <- c(rep(0, nrow(z0)), rep(1, nrow(z1))) 
     xx <- c(z0[,i], z1[,i]) 
     pval[i] <- chisq.test(table(xx, index), simulate.p.value=TRUE)$p.value  
    } 
    } 
    return(pval) 
} 
compare.matrix(z0, z1) 
+0

短語「t-test for equal mean difference」讓我想知道你是否想要配對t檢驗,但如果沒有,那麼你的方法看起來是合理的(但我會用「t-測試沒有差異的意思「。) – 2014-12-05 21:54:14

+0

謝謝。我根據你的建議改變了文字 – mrb 2014-12-06 16:41:33

回答

1

下面是使用dplyr的一種方式。如果您有大矩陣,將前三行合併爲一個步驟可能會更好,但爲了清晰起見,我將它們分開了。我認爲卡方情況將是一個相當簡單的延伸。

z0_melt = melt(z0, value.name='z0')[,c('Var2','z0')] 
z1_melt = melt(z1, value.name='z1')[,c('Var2','z1')] 
all_df = merge(z0_melt, z1_melt) 

library(dplyr) 

all_df %>% 
    group_by(Var2) %>% 
    summarize(p = t.test(z0, z1)$p.value)