You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

报错原因分析

  1. 参数使用错误:estimateNetwork()是bootnet包的函数,指定mgm作为估计器时,需用estimator = "mgm"参数,而非reg = "mgl"——reg参数用于指定正则化方法,无法识别"mgl"对应的估计器,导致函数无法找到正确的执行函数,触发报错。
  2. 输入数据错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:35:46