2012-11-21 78 views
11

我是R的新手,所以我很抱歉如果这是一个直截了当的问题,但是我今天晚上做了相当多的搜索,似乎无法弄清楚。我有一个数据框和一大堆变量,我想要做的是创建一个表中的一部分相关性,基本上相当于Stata中的“pwcorr”,或者是“相关性” SPSS。一个关键是,我不仅需要r,但我也希望与该价值相关的重要性。成对相关表

任何想法?这似乎应该是非常简单的,但我似乎无法找出一个好方法。

+1

'cor'。看看'?cor' – mnel

+1

@mnel - '?cor'虽然没有给出p值。 “Hmisc”库中的'rcorr'将会这样做。 – thelatemail

+1

@thelatemail'?cor'将链接到'cor.test',这将会(如果OP遵循这个建议,他应该会发现这一点)。 – mnel

回答

8

比尔·维纳布尔斯提供从R邮件列表中this answer此解决方案我已经做了一些细微的修改:

cor.prob <- function(X, dfr = nrow(X) - 2) { 
    R <- cor(X) 
    above <- row(R) < col(R) 
    r2 <- R[above]^2 
    Fstat <- r2 * dfr/(1 - r2) 
    R[above] <- 1 - pf(Fstat, 1, dfr) 

    cor.mat <- t(R) 
    cor.mat[upper.tri(cor.mat)] <- NA 
    cor.mat 
} 

因此,让我们测试一下:

set.seed(123) 
data <- matrix(rnorm(100), 20, 5) 
cor.prob(data) 

      [,1]  [,2]  [,3]  [,4] [,5] 
[1,] 1.0000000  NA  NA  NA NA 
[2,] 0.7005361 1.0000000  NA  NA NA 
[3,] 0.5990483 0.6816955 1.0000000  NA NA 
[4,] 0.6098357 0.3287116 0.5325167 1.0000000 NA 
[5,] 0.3364028 0.1121927 0.1329906 0.5962835 1 

这是否排队与cor.test?

cor.test(data[,2], data[,3]) 

Pearson's product-moment correlation 
data: data[, 2] and data[, 3] 
t = 0.4169, df = 18, p-value = 0.6817 
alternative hypothesis: true correlation is not equal to 0 
95 percent confidence interval: 
-0.3603246 0.5178982 
sample estimates: 
     cor 
0.09778865 

似乎工作正常。

+0

这绝对看起来像是一个很好的解决方案,但是,我很难弄清楚如何首先从我的数据中构建一个矩阵。正如我所说,我有一个包含〜400个变量(列)和371个主题(行)的数据框,但是像cor.prob(matrix(var10,var11))这样的东西似乎给了我这些变量中每行之间的相关性,而不是代表两个变量之间相关性的一个系数。 – Cody

+0

所以我想出了一个解决方案,我最后的评论 - 它看起来像我应该这样做我的数据: 'cor(cbind(data $ var1,data $ var2),use =“complete.obs “) 但是,我无法扩展你的代码以包含'use =”complete.obs“'。对此有何想法? – Cody

+0

@Cody尝试在数据框上使用'na.omit'来创建一个新的数据框并查看是否解决了您的问题。 –

3

这是我刚刚做的,我偶然发现这篇文章,因为我正在寻找一种方法来获取每一对变量,并获得一个整齐的nX3数据框。列1是变量,列2是变量,列3和列4是它们的绝对值和真实相关性。只需将函数传递给数字和整数值的数据框即可。

pairwiseCor <- function(dataframe){ 
    pairs <- combn(names(dataframe), 2, simplify=FALSE) 
    df <- data.frame(Vairable1=rep(0,length(pairs)), Variable2=rep(0,length(pairs)), 
        AbsCor=rep(0,length(pairs)), Cor=rep(0,length(pairs))) 
    for(i in 1:length(pairs)){ 
    df[i,1] <- pairs[[i]][1] 
    df[i,2] <- pairs[[i]][2] 
    df[i,3] <- round(abs(cor(dataframe[,pairs[[i]][1]], dataframe[,pairs[[i]][2]])),4) 
    df[i,4] <- round(cor(dataframe[,pairs[[i]][1]], dataframe[,pairs[[i]][2]]),4) 
    } 
    pairwiseCorDF <- df 
    pairwiseCorDF <- pairwiseCorDF[order(pairwiseCorDF$AbsCor, decreasing=TRUE),] 
    row.names(pairwiseCorDF) <- 1:length(pairs) 
    pairwiseCorDF <<- pairwiseCorDF 
    pairwiseCorDF 
    } 

这是输出是什么:

> head(pairwiseCorDF) 
      Vairable1  Variable2 AbsCor  Cor 
    1  roll_belt  accel_belt_z 0.9920 -0.9920 
    2 gyros_dumbbell_x gyros_dumbbell_z 0.9839 -0.9839 
    3  roll_belt total_accel_belt 0.9811 0.9811 
    4 total_accel_belt  accel_belt_z 0.9752 -0.9752 
    5  pitch_belt  accel_belt_x 0.9658 -0.9658 
    6 gyros_dumbbell_z gyros_forearm_z 0.9491 0.9491 
3

我发现,将R包激情似火做了很好的工作处理,你有问题。您可以轻松地将数据集传递给cor.table函数,并获取所有变量的相关表和p值表。您可以在功能中指定皮尔逊的r或Spearman。请参阅此链接以获得帮助: http://www.inside-r.org/packages/cran/picante/docs/cor.table

还请记住在运行该函数之前从数据集中删除任何非数字列。下面是代码的例子件:

install.packages("picante") 
library(picante) 
#Insert the name of your dataset in the code below 
cor.table(dataset, cor.method="pearson") 
3

您可以使用sjPlot-packagesjt.corr功能,它给你一个很好的格式化相关表,就可以使用您的Office应用程序。

最简单的函数调用是只是传递数据帧:

sjt.corr(df) 

参见examples here

+0

不错。太悲伤了,它不适用于latex/pdf。 – jaySf

0

除了大cor.prob()的Funktion 塞巴斯蒂安-C援引上面我需要更换以短线的自相关性,与此代码来完成:

cor.tbl <- round(cor.prob(data), 3) 
cor.tbl[cor.tbl == 1] <- "-"