我正在编写一个函数,它将使用fa()
“psych”包中的函数。当fa()
无法收敛时,我希望我的函数丢弃结果并返回一个空图,只显示“收敛失败”。
我发现 fa() 有一个warnings=
选项,当它无法收敛时会打印一条消息,但我还没有找到一种方法来以编程方式检查返回的fa()
收敛结果。
在我的函数中,我通过传递fa(...)
用户在调用我的函数时设置的任何选项来进行调用。因此,用户可能会使用不同的因子提取方法、不同的 max.iter 值等。
当使用主轴因子提取方法(例如fm='pa'
)时,返回的对象fa()
包含一个由称为的迭代产生的值向量communality.iterations
,因此我可以这样做:
results <- fa(...)
# Check for Principal Axis factor extraction failing to converge
fa_args <- list(...) # Capture whatever the user gave my function to pass to fa()
if('fm' %in% names(fa_args) && fa_args$fm=='pa') {
max_iter <- ifelse('max.iter' %in% names(fa_args),fa_args$max.iter,50) # 50 is the default if not set
if(length(results$communality.iterations)==max_iter) { # Handle convergence failure
warning('Factor Analysis convergence failed for plot ',plot_title,'.',immediate.=T)
return(ggplot() + theme_void() + labs(title=plot_title,subtitle='Convergence failed'))
}
}
但这仅涵盖用户可能选择的一种因子提取方法,并且是以一种相当复杂的方式进行的。
有没有更好的方法来检查fa()
结果是否未能收敛?
注意:抱歉,我无法提供可重现的示例。我可以从文档中看出,其他因子提取方法(如最大似然法)可能无法收敛,但我还没有找到实现它的方法。以下是一次未能产生有关收敛失败警告的尝试:
library('psych')
bad_corr <- matrix(0,nrow=50,ncol=50)
diag(bad_corr) <- 1
x <- fa(r=bad_corr,nfactors=8,fm='ml',warnings=T)