2012-12-28 55 views
2

有沒有更好的方法來迭代給定數據集的一組參數?顯然,我試圖得到一個相關係數表:列是「CI,CVP,平均PAP,平均SAP」,行是「ALAT,ASAT,GGT,Bili,LDH,FBG」。對於每個組合,我想要得到相關係數和顯着性水平(p = ...)。 下面你看到「困難的方式」。但是,有沒有更優雅的方式,可能有可打印的表格?如何迭代通過參數進行分析

attach(Liver) 
cor.test(CI, ALAT, method = "spearman") 
cor.test(CI, ASAT, method = "spearman") 
cor.test(CI, GGT, method = "spearman") 
cor.test(CI, Bili, method = "spearman") 
cor.test(CI, LDH, method = "spearman") 
cor.test(CI, FBG, method = "spearman") 

cor.test(CVP, ALAT, method = "spearman") 
cor.test(CVP, ASAT, method = "spearman") 
cor.test(CVP, GGT, method = "spearman") 
cor.test(CVP, Bili, method = "spearman") 
cor.test(CVP, LDH, method = "spearman") 
cor.test(CVP, FBG, method = "spearman") 

cor.test(meanPAP, ALAT, method = "spearman") 
cor.test(meanPAP, ASAT, method = "spearman") 
cor.test(meanPAP, GGT, method = "spearman") 
cor.test(meanPAP, Bili, method = "spearman") 
cor.test(meanPAP, LDH, method = "spearman") 
cor.test(meanPAP, FBG, method = "spearman") 

cor.test(meanSAP, ALAT, method = "spearman") 
cor.test(meanSAP, ASAT, method = "spearman") 
cor.test(meanSAP, GGT, method = "spearman") 
cor.test(meanSAP, Bili, method = "spearman") 
cor.test(meanSAP, LDH, method = "spearman") 
cor.test(meanSAP, FBG, method = "spearman") 

detach("Liver") 

回答

9

有在庫ltm函數rcor.test()使相關係數和P值的表。例如使用的數據iris因爲沒有你的數據框。

library(ltm) 
rcor.test(iris[,1:4],method="spearman") 


      Sepal.Length Sepal.Width Petal.Length Petal.Width 
Sepal.Length *****  -0.167  0.882  0.834  
Sepal.Width 0.041  *****  -0.310  -0.289  
Petal.Length <0.001  <0.001  *****  0.938  
Petal.Width <0.001  <0.001  <0.001  *****  

upper diagonal part contains correlation coefficient estimates 
lower diagonal part contains corresponding p-values 
+7

「Hmisc」中還有'rcorr',它會爲您提供單獨的相關係數矩陣和p值。 – A5C1D2H2I1M1N2O1R2T1

10

訣竅是獲得所有可能的組合。在這裏,我創建了一個帶有10列的data.frame,並使用combn函數獲取所有組合。然後它非常直接地獲得corrleation和p-值。

set.seed(12) 
x <- as.data.frame(matrix(rnorm(100), nrow=10)) 
combinations <- combn(ncol(x), 2) 

out <- apply(combinations, 2, function(idx) { 
    t <- cor.test(x[, idx[1]], x[, idx[2]], method = "spearman") 
    c(names(x)[idx[1]], names(x)[idx[2]], t$estimate, t$p.value) 
}) 
# more formatting if necessary 
out <- as.data.frame(t(out)) 
names(out) <- c("col.idx1", "col.idx2", "cor", "pval") 

Edit:甚至更​​緊湊的代碼通過利用內combnFUN參數(按照Greg的建議)

set.seed(12) 
x <- as.data.frame(matrix(rnorm(100), nrow=10)) 
out <- as.data.frame(t(combn(ncol(x), 2, function(idx) { 
    t <- cor.test(x[, idx[1]], x[, idx[2]], method = "spearman") 
    c(names(x)[idx[1]], names(x)[idx[2]], t$estimate, t$p.value) 
}))) 
names(out) <- c("col.idx1", "col.idx2", "cor", "pval") 
+2

這就是我應該如何去做的,但是我很欣賞其他作者已經將測試過的代碼貢獻給知名軟件包(如Hmisc)的作品。 –

+2

我不確定,但我想你可能需要使用:t < - cor.test(x [,idx [1]],x [,idx [2]],method ='spearman')來得到答案原來的海報正在尋求。 –

+1

'combn'函數有一個'FUN'參數,所以上面可能可以通過將'apply'中使用的函數直接傳遞給'combn'來簡化。 –