计算R
问题描述:
中所有列(可能较大)矩阵中的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)
答
下面是使用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)
短语“t-test for equal mean difference”让我想知道你是否想要配对t检验,但如果没有,那么你的方法看起来是合理的(但我会用“t-测试没有差异的意思“。) – 2014-12-05 21:54:14
谢谢。我根据你的建议改变了文字 – mrb 2014-12-06 16:41:33