R:构建数据帧与数字变量之间的所有成对的相关性和显着性水平

问题描述:

为了能够让所有的数字变量之间的两两相关性和显着性水平的数据帧,我写了下面的小功能:R:构建数据帧与数字变量之间的所有成对的相关性和显着性水平

corwithsign=function(df,type="pearson") { 
    df=df[,sapply(df, is.numeric)] # only keep numeric variables in data frame 
    vars=names(df) 
    nvars=length(vars) 
    nvals=(nvars*nvars-nvars)/2 # number of pairwise correlations between the variables 
    vars1=vars2=cors=pvals=n=vector("numeric",nvals) # make empty vectors to store results 
    row=1 # row of output table 
    for (v1 in (1:(nvars-1))) { 
    for (v2 in ((v1+1):nvars)) { 
     var1=vars[[v1]]; var2=vars[[v2]] 
     vars1[[row]]=var1; vars2[[row]]=var2 
     out=cor.test(df[,var1],df[,var2],use="pairwise.complete.obs",method=type) 
     cors[[row]]=out$estimate 
     pvals[[row]]=out$p.value 
     n[[row]]=out$parameter+2 # df + 2 
     row=row+1 
    } 
    } 
    data.frame(cbind(var1=vars1,var2=vars2,r=cors,p=pvals,n),row.names=NULL) 
} 

corwithsign(mtcars,type="pearson") 
    var1 var2     r     p n 
1 mpg cyl -0.852161959426613 6.11268714258096e-10 31 
2 mpg disp -0.847551379262479 9.3803265373813e-10 31 
3 mpg hp -0.776168371826586 1.78783525412106e-07 31 
4 mpg drat 0.681171907806749 1.77623992874132e-05 31 
5 mpg wt -0.867659376517228 1.29395870135052e-10 31 
6 mpg qsec 0.418684033921778 0.0170819884965197 31 
7 mpg vs 0.664038919127593 3.41593725443623e-05 31 
8 mpg am 0.599832429454648 0.000285020743935105 31 
9 mpg gear 0.480284757338842 0.00540094822470749 31 
10 mpg carb -0.550925073902459 0.00108444622049168 31 
... 

我只是想知道是否有更短,更优雅的方式来做到这一点,或者这种类型的功能可能已经在一些包中实现了? (我在Hmisc中看到了一些对rcorr的引用,但输出了两个矩阵,这对我来说并不好,因为我只想输出一个数据帧)。

有什么想法?

欢呼声, 汤姆

+0

这是一个学习r的练习吗? 'psych'库有一个很好的'corr.test'函数,它给出的不仅仅是普通的'cor.test',特别是'corr.test(mtcars)$ ci'非常接近'corwithsign'的作用 – rawr 2014-09-29 11:51:45

+0

我知道它非常微不足道 - 我只是在这里制作一些幻灯片来介绍统计学课程,并希望确保以最优雅的方式做事情(另外我有点惊讶,cor.test或某些东西不能给这个输出类型)。但我会去corr.test(mtcars)$ ci然后 - 这似乎确实更优雅(我想尽可能避免自定义函数) - 谢谢! – 2014-09-29 12:04:04

正如上面提到的,psych库有一个很好的corr.test功能,提供了比只是正常的基地cor.test以上,特别

corr.test(mtcars)$ci

相当接近到什么corwithsign