R语言CFA代码报错Error in file(file, "r") : cannot open the connection求助
问题排查与解决方法
核心报错原因
你调用的是sem包的cfa()函数,而非CFA分析常用的lavaan包的cfa()函数。sem包的cfa()要求第一个参数是模型文件的路径,但你传入的是字符串格式的模型公式,它会将这个字符串当作文件名尝试读取,因此触发了无法打开文件连接的报错。
分步解决方法
1. 切换到lavaan包的cfa()函数
lavaan是CFA分析的标准工具,支持直接传入字符串模型公式。执行以下操作:
- 卸载已加载的
sem包(避免函数冲突):detach("package:sem", unload = TRUE) - 安装并加载
lavaan包:install.packages("lavaan") # 未安装时运行 library(lavaan)
2. 修正模型公式语法
你的当前模型将所有项目都归到了General单个因子下,不符合“三因子”CFA的需求。正确的三因子模型写法如下:
three_factor_groups <- 'Machiavellianism =~ Machiavellianism1 + Machiavellianism2 + Machiavellianism3 + Machiavellianism4 + Machiavellianism5 + Machiavellianism6 + Machiavellianism7 + Machiavellianism8 + Machiavellianism9 Narcissism =~ Narcissism1 + Narcissism2 + Narcissism3 + Narcissism4 + Narcissism5 + Narcissism6 + Narcissism7 + Narcissism8 + Narcissism9 Psychopathy =~ Psychopathy1 + Psychopathy2 + Psychopathy3 + Psychopathy4 + Psychopathy5 + Psychopathy6 + Psychopathy7 + Psychopathy8 + Psychopathy9'
3. 验证数据集完整性
- 确认
df3中存在country列,且为分类变量(因子/字符型):# 检查country列是否存在 "country" %in% colnames(df3) # 查看分组分布 table(df3$country) - 检查所有模型涉及的变量(如
Machiavellianism1等)是否存在于df3中,避免拼写错误或缺失列:# 列出模型变量 model_vars <- c(paste0("Machiavellianism", 1:9), paste0("Narcissism", 1:9), paste0("Psychopathy", 1:9)) # 检查是否都在数据集中 all(model_vars %in% colnames(df3))
4. 清理重复加载的包
简化包加载代码,避免重复加载同一包:
# 统一加载所需包 library(haven) library(dplyr) library(vctrs) library(semTools) library(psych) library(readr) library(lavaan) library(semPlot) library(qgraph)
修正后的完整代码示例
# 加载包 library(haven) library(dplyr) library(vctrs) library(semTools) library(psych) library(readr) library(lavaan) library(semPlot) library(qgraph) # 读取并合并数据 NewIrishdata <- read_sav("NewIrishdata.sav") df3 <- bind_rows(Englishdark, NewIrishdata) # 定义三因子模型 three_factor_groups <- 'Machiavellianism =~ Machiavellianism1 + Machiavellianism2 + Machiavellianism3 + Machiavellianism4 + Machiavellianism5 + Machiavellianism6 + Machiavellianism7 + Machiavellianism8 + Machiavellianism9 Narcissism =~ Narcissism1 + Narcissism2 + Narcissism3 + Narcissism4 + Narcissism5 + Narcissism6 + Narcissism7 + Narcissism8 + Narcissism9 Psychopathy =~ Psychopathy1 + Psychopathy2 + Psychopathy3 + Psychopathy4 + Psychopathy5 + Psychopathy6 + Psychopathy7 + Psychopathy8 + Psychopathy9' # 运行分组CFA fit_CFA_groups <- cfa(three_factor_groups, data = df3, group = "country") summary(fit_CFA_groups) # 绘制路径图 semPaths(fit_CFA_groups, layout='circle', style = "lisrel", what="std", combineGroups = F)
内容的提问来源于stack exchange,提问作者Megan Owen
相关产品推荐
相关产品推荐

