我想在维度(50x752)的数据框上执行chisq.test。我想得到所有列的所有可能的paire-wise比较的pvalues(通过多次测试调整)。最后,我想找回一个矩阵(50x50)来生成调整后的chisq pvalues的热图。这就是我现在所做的事情,但这远非理想。
步骤1:进行pairewise比较
function(data,p.adjust.method="holm")
{
cor.mat <- cor(data)
x<-ncol(data)#nb of column in matrix here 50
y<-nrow(data)#nb of column in matrix here 758
index<-t(combn(x, 2)) #create the matrix position of output for all possible combination
nindex <- nrow(index)
pvals <- numeric(nindex)
for (i in 1:nindex)
{
pvals[i]<-chisq.test(data[, index[i, 1]], data[, index[i,2]])$p.value
}
pvals<-p.adjust(pvals,method = p.adjust.method)
out <- as.data.frame(cbind(index, pvals))
}
步骤2:使用
将输出表转换为矩阵 dcast(df,V2~V1,fill=1) # thanx to Roland for this function!
但这不能正常工作,因为我没有镜像最终矩阵中的p值,我必须操纵第一个函数的输出以使对角线填充为0(将列与自身进行比较时)。非常感谢您的帮助!
答案 0 :(得分:2)
喜欢这个吗?
#some data
set.seed(42)
df <- data.frame(a=rbinom(1000,5,0.3),
b=rbinom(1000,5,0.001),
c=rbinom(1000,5,0.1),
d=rbinom(1000,5,0.9))
#function to calculate the adj. p-value
fun <- function(x,y) {
p.adjust(chisq.test(df[,x],df[,y])$p.value,method="holm",n=choose(ncol(df),2))
}
p.adj <- outer(names(df),names(df),FUN=Vectorize(fun)) #use outer to get a matrix
diag(p.adj) <- 1 #you should find out why chisq.test returns zero at the diag
rownames(p.adj) <- names(df)
colnames(p.adj) <- names(df)
p.adj
# a b c d
#a 1 1.0000000 1 1.0000000
#b 1 1.0000000 1 0.6152165
#c 1 1.0000000 1 1.0000000
#d 1 0.6152165 1 1.0000000