美文网首页
15.2 相关系数和协方差

15.2 相关系数和协方差

作者: 砖头机的灵感 | 来源:发表于2018-12-03 21:24 被阅读0次

    首稿于2018-12-03


    > #install.packages("GGally")
    > #chooseCRANmirror()
    > #install.packages("RXKCD")
    

    当处理一个以上的变量时,需要测度它们之间的相互关系。两个简单直接的方法是求其相关系数和协方差。先看看ggplot2中的数据集economics。

    > require(ggplot2)
    > head(economics)
    ## cor函数计算其相关关系
    > cor(economics$pce,economics$psavert)
    ## 或者根据公式计算
    > xPart <- economics$pce - mean(economics$pce)
    > yPart <- economics$psavert - mean(economics$psavert)
    > nMinusOne <- (nrow(economics) - 1)
    > xSD <- sd(economics$pce)
    > ySD <- sd(economics$psavert)
    > sum(xPart * yPart) / (nMinusOne * xSD* ySD)
    
    ##同时比较多个变量,可以对矩阵(必须为数值型变量)用函数cor
    > cor(economics[,c(2,4:6)])
    
    ## 骚气的用GGally包展示每一个变量和其他变量散点图。
    ## 这里不是通过require去加载包,而是用 :: 直接调用它包内的函数,这个操作符号可以无须加载包就可以调用其中的函数。
    > GGally::ggpairs(economics[,c(2,4:6)])
    
    数据集economics中各对变量之间的散点图并显示其相关系数
    ## 上图是根据原始数据绘制的,没有直接明了地展现各个变量间的相关系数。
    ## 为此,绘制相关变量的热图。
    ## 较高的正相关系数,意味着两变量有密切的正向关系,具有较低的负相关系数,意味着两变量有密切的反向关系,接近于0的相关系数意味着两者没有密切的相关关系。
    > require(reshape2)
    > require(scales)
    > econCor <- cor(economics[,c(2,4:6)])
    > econCor
    > econMelt <- melt(econCor, varnames=c("x","y"),value.name="Correlation")
    
    > econMelt <- econMelt[order(econMelt$Correlation),]
    > econMelt
    > ggplot(econMelt, aes(x=x,y=y)) + 
      geom_tile(aes(fill=Correlation)) + 
      scale_fill_gradient2(low=muted("red"), mid="white",high="steelblue",guide=guide_colorbar(ticks=FALSE, barheight=10), limits=c(-1,1)) + 
      theme_minimal() + labs(x=NULL,y=NULL)
    
    数据集economics中变量的相关系数热图。对角线上的图形显示相关系数为1,这是因为每个变量都和自身完全相关。红色代表高度负相关,蓝色代表高度正相关,白色代表没有相关宣传
    ## 有缺失值时的处理方法
    ## 函数cor不用设置参数na.rm来除去缺失值,而是应用“all.obs”、“complete.obs”、
    ## “pairwise.complete.obs”、“everything” 或者 “na.or.complete”其中一种方法来
    ## 计算多个变量的相关关系。
    > m <- c(9,9,NA,3,NA,5,8,1,10,4)
    > n <- c(2,NA,1,6,6,4,1,1,6,7)
    > p <- c(8,4,3,9,10,NA,3,NA,9,9)
    > q <- c(10,10,7,8,4,2,8,5,5,2)
    > r <- c(1,9,7,6,5,6,2,7,9,10)
    > theMat <- cbind(m,n,p,q,r)
    > theMat
    
    cor(theMat, use = "all.obs")
    > Error in cor(theMat, use = "all.obs") : cov/cor中有遗漏值
    > cor(theMat, use = "na.or.complete")
               m          n          p          q          r
    m  1.0000000 -0.5228840 -0.2893527  0.2974398 -0.3459470
    n -0.5228840  1.0000000  0.8090195 -0.7448453  0.9350718
    p -0.2893527  0.8090195  1.0000000 -0.3613720  0.6221470
    q  0.2974398 -0.7448453 -0.3613720  1.0000000 -0.9059384
    r -0.3459470  0.9350718  0.6221470 -0.9059384  1.0000000
    
    > cor(theMat[c(1,4,7,9,10),])
               m          n          p          q          r
    m  1.0000000 -0.5228840 -0.2893527  0.2974398 -0.3459470
    n -0.5228840  1.0000000  0.8090195 -0.7448453  0.9350718
    p -0.2893527  0.8090195  1.0000000 -0.3613720  0.6221470
    q  0.2974398 -0.7448453 -0.3613720  1.0000000 -0.9059384
    r -0.3459470  0.9350718  0.6221470 -0.9059384  1.0000000
    
    > identical(cor(theMat, use = "complete.obs"), cor(theMat[c(1,4,7,9,10), ]))
    [1] TRUE
    
    > cor(theMat, use = "pairwise.complete.obs")
                m           n          p          q          r
    m  1.00000000 -0.02511812 -0.3965859  0.4622943 -0.2001722
    n -0.02511812  1.00000000  0.8717389 -0.5070416  0.5332259
    p -0.39658588  0.87173889  1.0000000 -0.5197292  0.1312506
    q  0.46229434 -0.50704163 -0.5197292  1.0000000 -0.4242958
    r -0.20017222  0.53322585  0.1312506 -0.4242958  1.0000000
    > cor(theMat[, c("m","p")], use = "pairwise.complete.obs")
               m          p
    m  1.0000000 -0.3965859
    p -0.3965859  1.0000000
    
    > cor(theMat, use = "everything")
    > cor(theMat, use = "all.obs")
    > cor(theMat, use ="complete.obs")
    > cor(theMat, use = "na.or.complete")
    > cor(theMat[c(1,4,7,9,10),])
    > identical(cor(theMat, use = "complete.obs"), cor(theMat[c(1,4,7,9,10), ]))
    > cor(theMat, use = "pairwise.complete.obs")
    > cor(theMat[, c("m","p")], use = "pairwise.complete.obs")
    
    > data(tips, package = "reshape2")
    > head(tips)
    > GGally::ggpairs(tips)
    
    用tips中连续变量和分类变量绘制出的ggpairs图
    ## 相关性并不意味着存在因果关系。两个变量有相关关系也不一定说明它们是相互影响的。
    ## 来自动漫深深的鄙视
    > require(RXKCD)
    > require(RXKCD)
    > getXKCD(which = "552")
    
    15-3-RXKCD.png
    > cov(economics$pce, economics$psavert)
    > cov(economics[, c(2,4:6)])
    
    ## cov 和 cor差别在公式上。cor多除了两个标准差
    > identical(cov(economics$pce, economics$psavert),
                cor(economics$pce, economics$psavert) * sd(economics$pce) * sd(economics$psavert))
    [1] TRUE
    > savehistory("practice-15.R")
    

    加料:
    cor函数中四种方法解读:
    1 everthing, 它意味着所有列的元素必须不含缺失值,否则结果是NA。
    2 all.obs, 同样要求所有列不含缺失值否者提示错误。
    3,4 complete.obs 和 na.or.complete 处理方法类似,它们仅留下不存在缺失值的行。两者的不同在于,如果经过处理后没有一个具有完整数据的行,complete.obs 会发返回错误提示,而 na.or.complete 会反回NA。
    5 pairwise.complete.obs 用途更加广泛。它依次比较多对变量,并把两个变量相互之间的缺失列剔除,用余下的数据计算两者的相关系数。这种方法在本质上是与complete.obs在计算每一对变量组合的相关系数是相同的。

    相关文章

      网友评论

          本文标题:15.2 相关系数和协方差

          本文链接:https://www.haomeiwen.com/subject/eyuucqtx.html