R语言psych报错:Error in eigen(rx) : infinite or missing values in ‘x‘

起因

今天师姐用R语言psych包分析数据(这个包是做主成分分析的),她把数据导入函数 fa.parallel,数据格式是行是病人,列是症状,有症状是1,没有症状是0,像这样
在这里插入图片描述
在分析数据之前已经把NA去掉,但是跑这个函数的时候还是报错

Error in eigen(rx) : infinite or missing values in 'x'
In addition: Warning message:
In cor(x, use = use) : the standard deviation is zero

在已经把缺失值替换掉的情况下还是会出现这样的情况,我没想明白。没办法,我只好把这个函数的源码弄出来,源码是这样的
源码太长,我就放重点

else {
        if (isCorrelation(x)) {
            warning("It seems as if you are using a correlation matrix, but have not specified the number of cases. The number of subjects is arbitrarily set to be 100  ")
            rx <- x
            nsub = 100
            n.obs = 100
            resample <- FALSE
        }
        else {
            switch(cor, cor = {
                rx <- cor(x, use = use)
            }, cov = {
                rx <- cov(x, use = use)
                covar <- TRUE
            }, tet = {
                rx <- tetrachoric(x, correct = correct)$rho
            }, poly = {
                rx <- polychoric(x, correct = correct)$rho
            }, mixed = {
                rx <- mixedCor(x, use = use, correct = correct)$rho
            }, Yuleb = {
                rx <- YuleCor(x, , bonett = TRUE)$rho
            }, YuleQ = {
                rx <- YuleCor(x, 1)$rho
            }, YuleY = {
                rx <- YuleCor(x, 0.5)$rho
            })
        }
    }
    valuesx <- eigen(rx)$values
    if (SMC) {
        diag(rx) <- smc(rx)
        fa.valuesx <- eigen(rx)$values
    }

这个函数先用cor这个函数计算了矩阵,然后把这个矩阵作为eigen这个包的输入,那么我猜测是不是因为相关矩阵里面出现了NA导致最终函数报错,果然,在函数外单独跑cor的时候,相关矩阵里面有NA。
所以如果要跑这个函数,需要先跑一下

cor(df, use = "pairwise")

然后看一下矩阵里面到底哪一列是NA,然后把这个变量去掉。就可以出结果,但是我现在还没太弄明白为什么相关矩阵会有NA,初步怀疑是因为有些症状没有一个病人出现,导致了NA。

结论

先跑

cor(df, use = "pairwise")

去除NA之后再跑
fa.parallel(x = …)
一个多小时才搞定,不写个东西记录一下防止大家踩坑就亏了,祝各位科研顺利。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值