zoukankan      html  css  js  c++  java
  • 偏最小二乘回归分析建模步骤的R实现(康复俱乐部20名成员测试数据)+补充pls回归系数矩阵的算法实现

    kf=read.csv('d:/kf.csv') # 读取康复数据
    kf
    sl=as.matrix(kf[,1:3]) #生成生理指标矩阵
    xl=as.matrix(kf[,4:6]) #生成训练指标矩阵
    x=sl
    x
    y=xl
    y
    x0=scale(x)
    x0
    y0=scale(y)
    y0
    m=t(x0)%*%y0%*%t(y0)%*%x0
    m
    eigen(m)
    w1=eigen(m)$vectors[,1]
    v1=t(y0)%*%x0%*%w1/sqrt(as.matrix(eigen(m)$values)[1,])
    v1
    t1=x0%*%w1 #第一对潜变量得分向量
    t1 # 以上为第一步(1)分别提取两变量组的第一对成分,并使之相关性达最大。
    u1=y0%*%v1
    u1 #第一对潜变量得分向量
    library("pracma")
    α1=inv(t(t1)%*%t1)%*%t(t1)%*%x0 #也可由t(x0)%*%t1/norm(t1,'2')^2算得α1 #α1在pls中称为模型效应负荷量
    β1=inv(t(t1)%*%t1)%*%t(t1)%*%y0 #也可由t(y0)%*%t1/norm(t1,'2')^2算得β1
    t(x0)%*%t1/norm(t1,'2')^2 # norm(t1,'2')为svd(t1)即t1的最大奇异值,也可用sqrt(t(t1)%*%t1)求得
    t(y0)%*%t1/norm(t1,'2')^2 # 以上为第二步(2)建立y对T1的回归及x对T1的回归。
    α1
    β1
    lm(x0~t1) #验证α1即为x0做应变量,t1做自变量的最小二回归的t1的回归系数(分别为weight、waist和pulse的回归系数,共3个)
    lm(y0~t1) #验证β1即为y0做应变量,t1做自变量的最小二回归的t1的回归系数(分别为chins、situps和jumps的回归系数,共3个)
    B=t(x0)%*%u1%*%inv(t(t1)%*%x0%*%t(x0)%*%u1)%*%t(t1)%*%y0 #保留第一对潜变量对应的标准化自变量x和标准化应变量y的pls回归系数矩阵(该矩阵公式参见‘KernelPartialLeastSquaresRegressionin Reproducing KernelHilbert Space’p102)

    B
    library("pls")
    pls1=plsr(y0~x0,ncomp=1,validation='LOO',jackknife=T)
    coef(pls1) #上式中B的求解等价于R的pls包中保留一个主成分的结果,系数为标准化回归系数,可以通过逆标准化过程还原为原始自变量x和应变量y的回归系数。以下保留2个主成分的结果中有具体逆标准化过程。
    px0=t1%*%α1 #求x0的预测值矩阵
    E1=x0-px0 #求x0的残差矩阵
    py0=t1%*%β1 #求y0的预测值矩阵
    F1=y0-py0 # #求y0的残差矩阵   
    m2=t(E1)%*%F1%*%t(F1)%*%E1 #(3)用残差阵E1和F1代替x0和y0重复以上步骤。
    eigen(m2)
    w2=eigen(m2)$vectors[,1]
    w2
    v2=t(F1)%*%E1%*%w2/sqrt(as.matrix(eigen(m2)$values)[1,])
    v2
    t2=E1%*%w2
    t2
    u2=F1%*%v2
    u2
    α2=inv(t(t2)%*%t2)%*%t(t2)%*%E1 #也可由t(E1)%*%t2/norm(t2,'2')^2算得α2
    β2=inv(t(t2)%*%t2)%*%t(t2)%*%F1 #也可由t(F1)%*%t2/norm(t2,'2')^2算得β2
    α2
    β2
    library("pls")
    pls1=plsr(y0~x0,ncomp=2,validation='LOO',jackknife=T) #以下为R中pls包运算结果,显示回归结果(包括预测值误差平方和PRESS与变异解释度),与上述纯算法结果进行对比和补充, 
    summary(pls1) #其中对于解释变量潜变量T1对应变量y的总变异解释的比例为chins(23.26%)、situps(35.06%)和jumps(4.14%)等价于SAS中对y的综合结果20.9447≈mean(23.26%,35.06%,4.14%)四舍五入造成的。2 comps列显示的为引入第二解释变量潜变量后的对应变量y的总变异解释的比例。
    coef(pls1) #以应变量situps为例得situps关于各自变量的回归方程(*表示标准化):situps*=-0.13846688weight*-0.52444579waist*-0.08542029pulse* 据此标准化回归方程可以推导出原始变量y与x的回归方程:(situps-mean(situps))/sd(situps)=-0.13846688*(weight-mean(weight))/sd(weight)-0.52444579*(waist-mean(waist))/sd(waist)-0.08542029*(pulse-mean(pulse))/sd(pulse)——>situps=sd(situps)[-0.13846688*(weight-mean(weight))/sd(weight)-0.52444579*(waist-mean(waist))/sd(waist)-0.08542029*(pulse-mean(pulse))/sd(pulse)]+mean(waist)
    sd(y[,2])*-0.1384668393/sd(x[,1]) #weight的回归系数
    sd(y[,2])*-0.52444579/sd(x[,2]) #waist的回归系数
    sd(y[,2])*-0.08542029/sd(x[,3]) #pulse的回归系数
    sd(y[,2])*(-0.13846688*-mean(x[,1])/sd(x[,1])+-0.52444579*-mean(x[,2])/sd(x[,2])+-0.08542029*-mean(x[,3])/sd(x[,3]))+mean(y[,2]) #原始变量y与x的回归方程截距
    model="SITUPS=612.56712-0.35088WEIGHT-10.24768WAIST-0.74122PULSE——耶!与SAS给出的结果完全一致。"
    model
    jack.test(pls1) #即对coef(pls1)生成的系数进行假设检验
    scores(pls1) #即求第一解释潜变量的得分向量t1=x0%*%w1和第二解释变量潜变量的得分向量t2=E1%*%w2
    loadings(pls1) #即求α1
    plot(pls1)
    validationplot(pls1) #validationplot()函数可以画出PLS模型在不同主成分数下对应的RMSEP(由留一交叉验证法算得的均方预测误差根)
    predict(pls1) #即求py0=t1%*%β1
    #关于决定系数算法还需研究

    转自:http://my.oschina.net/u/1272414/blog/214881

    ---------------------------------------------------------------------------------- 数据和特征决定了效果上限,模型和算法决定了逼近这个上限的程度 ----------------------------------------------------------------------------------
  • 相关阅读:
    Navicat连接mysql提示1251解决方案
    js获取select下拉框选中的值
    Windows下安装Mysql数据库
    ASP.NET MVC API以及.Core API进行安全拦截和API请求频率控制
    myeclipse 10.7中文破解版 下载安装看着一篇就够了
    Runtime exception at 0x004000bc: invalid integer input (syscall 5)
    MARS(MIPS汇编程序和运行时模拟器)
    如何将本地的代码上传到github
    JavaWeb基础
    大学什么时候开学?这款小程序告诉你!
  • 原文地址:https://www.cnblogs.com/payton/p/5253035.html
Copyright © 2011-2022 走看看