采用主成分法实现因子分析中的参数估计

半腔热情 提交于 2019-12-27 18:50:28

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

factpca<-function(x,score="Bartlett",rotation="varimax")
{
    if(!is.matrix(x)){
    x<-as.matrix(x)       #x为原始的数据矩阵
    }
    z<-scale(x,center=TRUE,scale=TRUE)   #将原始数据矩阵标准化
    p<-ncol(x)    #求观测变量的个数
    if(p<3){
        stop("factor analysis requires at least three variables")
    }
    cr<-cor(z)    #求相关系数矩阵
    eig<-eigen(cr)  #求矩阵的特征值与特征向量
    s=sum(eig$values)
    tmp=0.0
    flag=0
    for(i in 1:length(eig$values)){
       tmp=tmp+eig$values[i]
       flag=i
       if(tmp/s>=0.8)
       break
    }
    rowname<-paste("X",1:p,sep="")
    colname<-paste("Factor",1:flag,sep="")
    A<-matrix(0,nrow=p,ncol=flag,dimnames=list(rowname,colname)) #构造因子载荷矩阵,初始化为0
    for(j in 1:flag){
      A[,j]=sqrt(eig$values[j])*eig$vectors[,j]  #填充矩阵A的值
    }
    A2<-A                  #未旋转的载荷矩阵
    var.A<-diag(A%*%t(A))  #公共因子的方差
    D1<- 1-var.A          #特殊因子的方差
    rotmat<-matrix(0,ncol=flag,nrow=flag)
    if(rotation=="varimax"){      #采用最大方差旋转法,进行因子旋转
        #rot<-varimax(A)
        rot<-do.call(rotation,c(list(A)))
        A1<-rot$loadings           #A1为旋转后的载荷矩阵
        rotmat<-rot$rotmat        #rotmat为旋转矩阵
        A<-A1
    }
    D<-diag(D1)      #特殊因子方差矩阵
    D2<-solve(D)     #特殊因子方差矩阵的逆矩阵
    F<-0
    if(score=="Bartlett"){
        F<-solve(t(A)%*%D2%*%A)%*%t(A)%*%D2
    }
    else if(score=="regression"){
        F<-t(A)%*%solve(cr)
    }
    scores<-F%*%t(z)
    #list(rotloadings=A,loadings=A2,eigenvalues=eig$values,eigenvalue=eig$values(1:flag),comdgree=var.A,F=F)
    result<-list(rotloadings=rot,loadings=A2,eigen=eig,comdgree=var.A,F=F,scores=t(scores))
    result
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!