mgm包中estimateNetwork函数调用报错问题求助
混合图形模型(mgm包)运行报错问题求助
尝试使用mgm包运行混合图形模型,以下代码中最后两条estimateNetwork()命令无法运行,已重新加载相关包、重启R但问题仍未解决。代码及报错信息如下:
library(haven) flordiss <- read_sav("C:/Users/schul/OneDrive/Desktop/flordiss.sav") View(flordiss) library(mgm) # This is mgm 1.2-13 # Please report issues on Github: https://github.com/jmbh/mgm/issues library(huge) library(glasso) library(qgraph) library(bootnet) # Loading required package: ggplot2 # This is bootnet 1.5 # For questions and issues, please see github.com/SachaEpskamp/bootnet. mydata <- flordiss mydata_matrix <- as.matrix(mydata) # 第一条报错命令 my_model <- estimateNetwork(mydata_matrix, reg = "mgl", standardize = TRUE) # Error in do.call(.input$estimator, c(list(data), .input$arguments)) : # 'what' must be a function or character string # In addition: Warning messages: # 1: In formals(fun) : argument is not a function # 2: In formals(fun) : argument is not a function Corr_matrix <- cor(mydata) imputed_data <- apply(numeric_data, 2, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)) # Error in apply(numeric_data, 2, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), : # object 'numeric_data' not found numeric_data <- mydata[, sapply(mydata, is.numeric)] imputed_data <- apply(numeric_data, 2, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)) corr_matrix <- cor(imputed_data) qgraph(corr_matrix, layout = "spring", labels = colnames(imputed_data)) # 第二条报错命令 my_model <- estimateNetwork(corr_matrix, reg = "mgl", standardize = TRUE) # Error in do.call(.input$estimator, c(list(data), .input$arguments)) : # 'what' must be a function or character string # In addition: Warning messages: # 1: In formals(fun) : argument is not a function # 2: In formals(fun) : argument is not a function
报错原因分析
- 参数使用错误:
estimateNetwork()是bootnet包的函数,指定mgm作为估计器时,需用estimator = "mgm"参数,而非reg = "mgl"——reg参数用于指定正则化方法,无法识别"mgl"对应的估计器,导致函数无法找到正确的执行函数,触发报错。 - 输入数据错误:mgm包拟合混合图形模型需要原始混合类型数据(数值型+分类型),而非相关矩阵。相关矩阵丢失了变量类型信息,无法支持混合模型的估计逻辑。
解决方案
方案1:直接使用mgm包原生mgm()函数(推荐)
直接调用mgm包的核心函数拟合模型,避免bootnet的参数适配问题:
library(haven) library(mgm) library(qgraph) # 读取数据 flordiss <- read_sav("C:/Users/schul/OneDrive/Desktop/flordiss.sav") # 处理缺失值:数值变量均值插补,分类变量众数插补 # 数值变量处理 numeric_vars <- sapply(flordiss, is.numeric) flordiss[numeric_vars] <- lapply(flordiss[numeric_vars], function(x) { x[is.na(x)] <- mean(x, na.rm = TRUE) x }) # 分类变量处理(若存在) factor_vars <- sapply(flordiss, is.factor) flordiss[factor_vars] <- lapply(flordiss[factor_vars], function(x) { x[is.na(x)] <- names(which.max(table(x))) x }) # 定义变量类型:数值型为"g"(高斯),分类型为"c"(类别) var_types <- ifelse(numeric_vars, "g", "c") # 定义分类变量的水平数(需根据实际数据调整,示例假设所有分类变量为2水平) var_levels <- ifelse(factor_vars, 2, 1) # 拟合混合图形模型 my_model <- mgm(data = flordiss, type = var_types, level = var_levels, lambdaSel = "EBIC", # 正则化参数选择方法 regMethod = "glasso") # 正则化方法 # 可视化模型 qgraph(my_model$wadj, layout = "spring", labels = colnames(flordiss))
方案2:修正bootnet的estimateNetwork()参数
如果需要用bootnet的框架调用mgm,需指定正确的估计器参数,并传入原始数据:
library(bootnet) # 基于处理后的原始数据调用 my_model <- estimateNetwork(flordiss, estimator = "mgm", standardize = TRUE, arguments = list(type = var_types, level = var_levels))
内容的提问来源于stack exchange,提问作者Kaitlyn
相关产品推荐
相关产品推荐

