1

有没有更有效/更快的方法来比较两个矩阵(按列)并使用 t 检验计算 p 值,以确保均值没有差异(最终在必要时切换到 chisq.test)?

这是我的解决方案:

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

1 回答 1

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)
于 2014-12-05T21:25:44.997 回答