• 典型相关分析CCA计算过程


      本文介绍了CCA解决的问题,CCA原理的推导过程,以及对计算结果物理意义的解释。并且通过SPSS和R操作演示了一个关于CCA的例子。数据文件下载参考[8],SPSS输出结果文件下载参考[9],R代码文件下载参考[10]。

    一.CCA工作原理

    1.CCA定义

      首先需要搞清楚典型相关分析(Canonical Correlation Analysis)解决了什么问题,它解决的是一组变量与另外一组变量的相关问题。举个例子,比如想要量化家庭特征与家庭消费之间的关系,其中,家庭特征包括户主的年龄、家庭的年收入和户主受教育程序,而家庭消费包括每年去餐厅就餐的频率、每年外出看电影频率
      其实,这个是泛化后的问题,先来看一个更加具体的问题,不是一组变量与另外一组变量的相关问题,而是一个变量与另外一个变量的相关问题,比如计算两个变量XXYY的相关问题,是如何计算的呢,下面的方程是不是很眼熟:

    ρXY=cov(X,Y)var(X)var(Y)
    ρXY=cov(X,Y)var(X)var(Y)

      再进一步的想一下,如果是计算一个变量和一组变量的相关问题呢。当然更深一步的想象就是这篇文章要讲的一组变量与另外一组变量的相关问题。先来形式化的定义CCA:假设有一组变量X1,,XpX1,,Xp与另一组变量Y1,,YqY1,,Yq,要研究这两组变量的相关关系,如何给两组变量之间的相关性以数量的描述,就是CCA。

    二.CCA方程推导过程

    1.CCA的数学描述

      假设x1x1表示每年去餐馆就餐的频率,x2x2表示每年外出看电影频率,y1y1表示户主的年龄,y2y2表示家庭的年收入,y3y3表示户主受教育程度。典型相关分析的思想是找出第一对线性组合,使其具有最大相关性:

    u1=a11x1+a21x2+...+ap1xpv1=b11y1+b21y2+b31y3+...+bq1yqρ(u1,v1)=?
    u1=a11x1+a21x2+...+ap1xpv1=b11y1+b21y2+b31y3+...+bq1yqρ(u1,v1)=?

    然后再找第二对线性组合,使其具有次大相关性:

    u2=a12x1+a22x2+...+ap2xpv2=b12y1+b22y2+b32y3+...+bq2yqρ(u2,v2)=?
    u2=a12x1+a22x2+...+ap2xpv2=b12y1+b22y2+b32y3+...+bq2yqρ(u2,v2)=?

    就这样一直进行计算下去,直到第rr步,这两组变量的相关性被提取完毕为止,其中rmin(p,q)rmin(p,q),即可以得到rr组变量。

    2.CCA的推导过程

    假设两组变量的向量Z=(x1,x2,...,xp,y1,y2,...,yq),其协方差矩阵如下:

    =[11122112]

    其中,11是第一组变量的协方差矩阵,22是第二组变量的协方差矩阵,1221XY的协方差矩阵,它们之间的关系是转置相等,即12=T21。这样两组变量的第一对线性组合记为:

    u1=aT1Xv1=bT1Y

    其中a1b1表示:

    a1=(a11,a21,...,ap1)Tb1=(b11,b21,...,bq1)T

    接下来推导ρu1,v1的计算,通过求a1b1,使ρu1,v1最大,这个是CCA最核心的思想:

    var(u1)=aT1var(X)a1=aT111a1=1var(v1)=bT1var(Y)b1=bT122b1=1ρu1,v1=cov(u1,v1)=aT1cov(X,Y)b1=aT112b1

    接下来就是典型相关系数的过程。根据高等数学中条件极致的求法,即拉格朗日乘数法,通过引入拉格朗日乘数λν来求极值的问题,转换为求方程1的极大值:

    ϕ(a1,b1)=aT112b1λ2(aT111a11)ν2(bT122b11)

    接下来就是求极大值的思路了,各种求偏导,方程2如下所示:

    ϕa1=12b1λ11a1=0ϕb1=21a1v22b1=0

    方程3如下所示:

    12b1λ11a1=021a1v22b1=0

    将方程3分别左乘aT1bT1,得到方程4:

    aT112b1λaT111a1=0bT121a1vbT122b1=0

    进一步推导得出方程5:

    aT112b1=λbT121a1=v

    因此得到方程6:

    λ=v=aT112b1=ρ(u1,v1)

    可见λv是相等的,并且就是要求的ρu1,v1

    12122左乘方程3的第二式,得到方程7:

    1212221a1v1212222b1=0

    进一步简化得到方程8:

    1212221a1v12b1=0

    将方程3的第一式代入方程8,得到方程9:

    1212221a1λ211a1=0

    将方程9左乘111得到方程10:

    1111212221a1λ2a1=0

    在方程10中,1111212221的特征根是λ2,相应的特征向量为a1

    12111左乘方程3的第一式,并且将第二式代入得到方程11:

    2111121b1λ12a1=02111112b1λ222b1=01222111112b1λ2b1=0

    在方程11中,1222111112的特征根是λ2,相应的特征向量为b1

    M1=1111212221M2=1222111112,得到方程12:

    M1a=λ2aM2b=λ2b

    至此可以得出结论:第一个典型相关系数为λ1(最大特征值),其中λ21既是M1又是M2的特征根,第一对典型变量的系数a1b1是相应于M1M2的特征向量。这样就把典型相关分析的求解转换成了求M1M2的特征根和特征向量的问题。

    说明:第一对典型变量提取了原始变量XY之间相关的主要部分,如果这部分不能足以解释原始变量,可以在剩余的相关中再求出第二对典型变量和它们的典型相关系数。如此反复,直到这两组变量的相关性被提取完毕为止。

    3.CCA的物理意义

      还是以量化家庭特征与家庭消费之间的关系为例子,假设x1表示每年去餐馆就餐的频率,x2表示每年外出看电影频率,y1表示户主的年龄,y2表示家庭的年收入,y3表示户主受教育程度。如果计算出第一典型相关系数为0.687948,第二典型相关系数为0.186865。第一典型变量和第二典型变量代入方程如下所示:
    (1)第一对典型变量

    u1=0.9866x1+0.8872x2v1=0.4211y1+0.9822y2+0.5145y3

    • u1量化的是家庭消费特征,它与x1x2的相关系数分别为0.9866和0.8872,这2个值都是比较高的。
    • v1量化的是家庭特征,它与y2的相关系数为0.9822,其它的相关系数较小,因此v1主要代表的就是家庭收入。
    • u1v1的相关系数为0.687948,说明一个家庭的消费和家庭的收入关系密切。

    (2)第二对典型变量

    u2=0.1632x1+0.4614x2v2=0.8464y1+0.1101y2+0.3013y3

    • u2x2的相关系数为0.4614,可见u2主要代表的是每年外出看电影频率。
    • v2y1的相关系数为0.8464,可见v2主要代表的是家庭成员的年龄特征。
    • u2v2的相关系数为0.186865,说明一个家庭每年外出看电影频率和家庭成员的年龄特征关系密切。

    三.CCA代码例子

    1.SPSS28实现

    (1)变量视图和数据视图


    (2)分析->相关->典型相关分析

    将控制情绪、自我调节、自我激励作为集合1,将语文、数学、英语和才艺作为集合2:

    (3)生成结果

    2.R编程实现

    (1)安装R包
    操作系统使用的Windows10,版本号为20H2,R语言版本使用64位的R-3.6.3。期初在安装R包的时候总是报错,经过查找资料,需要将Packages页面中的第2和3个复选框去掉,重启RStudio即可:

    依次安装openxlsx、CCA和CCP包:

    install.packages("openxlsx", dependencies=TRUE)
    install.packages("CCA", dependencies=TRUE)
    install.packages("CCP", dependencies=TRUE)
    

    (2)R代码实现

    # 1.加载数据
    library(openxlsx)
    rawdata <- read.xlsx("F:/cca_data.xlsx", sheet = "典型相关分析")
    names(rawdata)
    
    # 2.对两组变量的数据做标准化处理
    xdata = scale(rawdata[, 1:3])
    ydata = scale(rawdata[, 4:7])
    
    # 3.执行典型相关分析
    library(CCA)
    mycca = cc(xdata, ydata)
    mycca
    
    # 4.检验典型相关系数在统计上是否显著
    library(CCP)
    rho = mycca$cor
    n = dim(rawdata)[1]
    p = dim(xdata)[2]
    q = dim(ydata)[2]
    p.asym(rho, n, p, q, tstat = 'Wilks')
    

    (3)输出结果

    > # 1.加载数据
    > library(openxlsx)
    > rawdata <- read.xlsx("F:/cca_data.xlsx", sheet = "典型相关分析")
    > names(rawdata)
    [1] "控制情绪" "自我调节" "自我激励" "语文"     "数学"     "英语"     "才艺"    
    > 
    > # 2.对两组变量的数据做标准化处理
    > xdata = scale(rawdata[, 1:3])
    > ydata = scale(rawdata[, 4:7])
    > 
    > # 3.执行典型相关分析
    > library(CCA)
    > mycca = cc(xdata, ydata)
    > mycca
    $cor
    [1] 0.9944827 0.8781065 0.3836057
    
    $names
    $names$Xnames
    [1] "控制情绪" "自我调节" "自我激励"
    
    $names$Ynames
    [1] "语文" "数学" "英语" "才艺"
    
    $names$ind.names
     [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26"
    [27] "27" "28" "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" "45" "46" "47" "48" "49" "50"
    
    
    $xcoef
                   [,1]      [,2]      [,3]
    控制情绪 -0.4576880 -1.277214  2.767301
    自我调节 -0.2118578  2.451745 -1.048019
    自我激励 -0.3687696 -1.122893 -1.806735
    
    $ycoef
               [,1]       [,2]       [,3]
    语文 -0.2755155 -0.7599743 -0.9739351
    数学 -0.1040424  0.6822849  0.4802843
    英语 -0.1916330 -1.0607433  0.5995720
    才艺 -0.6620838  0.7198947 -0.1194195
    
    $scores
    $scores$xscores
              [,1]         [,2]        [,3]
    1   0.97838292 -0.362539552  0.81938141
    2   1.40651588 -0.410239408  0.05351720
    ......
    49 -0.68982939 -1.133476875  0.34804581
    50 -0.86681530  1.107521445  0.63269334
    
    $scores$yscores
              [,1]        [,2]        [,3]
    1   0.97479103  0.09430244 -0.08851950
    2   1.40034960 -0.76140727  0.45769014
    ......
    49 -0.64792179 -1.26188686 -0.66195176
    50 -0.73030445  0.62990478  0.08452069
    
    $scores$corr.X.xscores
                   [,1]          [,2]         [,3]
    控制情绪 -0.9798776  0.0006477883  0.199598477
    自我调节 -0.9464085  0.3228847489 -0.007504408
    自我激励 -0.9518620 -0.1863009724 -0.243414776
    
    $scores$corr.Y.xscores
               [,1]       [,2]        [,3]
    语文 -0.6348095 -0.1894059 -0.24988439
    数学 -0.7171837  0.2086069  0.02598458
    英语 -0.6436782 -0.4402237  0.22027544
    才艺 -0.9388771  0.1734549  0.03614570
    
    $scores$corr.X.yscores
                   [,1]          [,2]         [,3]
    控制情绪 -0.9744713  0.0005688272  0.076567107
    自我调节 -0.9411869  0.2835272081 -0.002878734
    自我激励 -0.9466102 -0.1635921013 -0.093375287
    
    $scores$corr.Y.yscores
               [,1]       [,2]        [,3]
    语文 -0.6383313 -0.2156981 -0.65140953
    数学 -0.7211626  0.2375644  0.06773775
    英语 -0.6472493 -0.5013329  0.57422365
    才艺 -0.9440859  0.1975329  0.09422619
    
    > # 4.检验典型相关系数在统计上是否显著
    > library(CCP)
    > rho = mycca$cor
    > n = dim(rawdata)[1]
    > p = dim(xdata)[2]
    > q = dim(ydata)[2]
    > p.asym(rho, n, p, q, tstat = 'Wilks')
    Wilks' Lambda, using F-approximation (Rao's F):
                    stat    approx df1      df2      p.value
    1 to 3:  0.002148472 87.391525  12 114.0588 0.000000e+00
    2 to 3:  0.195241267 18.526265   6  88.0000 8.248957e-14
    3 to 3:  0.852846693  3.882233   2  45.0000 2.783536e-02
    
    折叠

    从结果上来看,无论是SPSS还是R,计算的结果都是完全相同的。

    参考文献:
    [1]典型相关分析:https://www.bilibili.com/video/BV1LZ4y1S7Vd
    [2]sklearn.cross_decomposition.CCA:https://scikit-learn.org/stable/modules/generated/sklearn.cross_decomposition.CCA.html
    [3]协方差矩阵:https://baike.baidu.com/item/协方差矩阵/9822183
    [4]典型相关分析(CCA)原理及Python实现:https://developer.aliyun.com/article/839949
    [5]CCA典型关联分析原理与Python案例:https://cloud.tencent.com/developer/article/1652998
    [6]典型关联分析(CCA)原理总结:https://www.cnblogs.com/pinard/p/6288716.html
    [7]典型相关分析:https://www.docin.com/p-212673286.html
    [8]数据文件cca_data.xlsx:https://url39.ctfile.com/f/2501739-631515818-1a4a0d?p=2096 (访问密码: 2096)
    [9]SPSS输出结果文件:https://url39.ctfile.com/f/2501739-631515819-214c93?p=2096 (访问密码: 2096)
    [10]R代码文件:https://url39.ctfile.com/f/2501739-631515820-50502e?p=2096 (访问密码: 2096)

  • 相关阅读:
    数据结构之队列
    Apache Paimon 文件管理
    Postman入门基础 —— 接口测试流程!
    PHP自增构造_GET
    MyBatis foreach标签有什么作用呢?
    数据迁移工具(数据库之间进行数据库迁移所使用的工具及迁移流程。)
    1-4 Linux 标准目录结构FHS
    C++中的泛型详细讲解
    前端通过Blob或File文件获取二进制数据
    系统安装(一)CentOS 7 本地安装
  • 原文地址:https://www.cnblogs.com/shengshengwang/p/16545070.html