起因
今天师姐用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 = …)
一个多小时才搞定,不写个东西记录一下防止大家踩坑就亏了,祝各位科研顺利。