运行HERGM与MLERGM模型报错:原因排查及解决方法咨询
HERGM与MLERGM模型报错:
invalid 'times' argument 排查与解决 错误信息
Error in rep(" ", max_char - num_chars[i]) : invalid 'times' argument
附加警告信息:In max(num_chars) : no non-missing arguments to max; returning -Inf
问题场景
实际使用含5969个节点及解释变量的大型网络数据集,以下是可复现的小型测试代码:
library(mlergm) library(hergm) # HERGM测试代码 my_sociomatrix <- matrix(round(runif(20*20)), nrow = 20, ncol = 20) test.network <- network(x = my_sociomatrix, directed = F, matrix.type = "adjacency") test.model <- hergm(test.network ~ edges_ij, max_iter = 4, method = "ml") # MLERGM测试代码 my_sociomatrix <- matrix(round(runif(30*30)), nrow = 30, ncol = 30) node_memb <- c(rep(1, 10), rep(2, 10), rep(3, 10)) mlnet <- mlnet(network = my_sociomatrix, node_memb = node_memb) model_est <- mlergm(mlnet ~ edges)
错误原因
这个错误本质是模型在格式化输出日志/结果时,尝试计算统计量名称的字符长度最大值,但因模型无法识别指定的统计量,导致num_chars为空数组,max(num_chars)返回-Inf,进而max_char - num_chars[i]得到负数,传给rep()的times参数无效。
针对HERGM的具体原因
hergm包中没有edges_ij这个统计量,正确的边统计量是edges。错误的统计量名称会导致模型无法生成有效统计量列表,触发后续的输出格式化错误。
针对MLERGM的具体原因
- 部分场景下,mlergm在处理网络时,若统计量生成异常(或无有效统计量),会触发同样的输出格式化错误;
- 大型网络下,默认的详细输出逻辑可能因内存或字符计算溢出导致错误。
解决方法
HERGM修复方案
- 修正统计量名称:将模型公式中的
edges_ij替换为edges,这是hergm支持的标准边统计量:
test.model <- hergm(test.network ~ edges, max_iter = 4, method = "ml")
- 大型网络适配:对于5969节点的网络,建议先使用小样本验证公式正确性,再逐步扩展;同时可调整
max_iter参数,避免不必要的迭代消耗资源。
MLERGM修复方案
- 禁用详细输出:在
mlergm()中添加verbose = FALSE参数,跳过可能触发错误的格式化输出逻辑:
model_est <- mlergm(mlnet ~ edges, verbose = FALSE)
- 验证网络与分组匹配:确保
node_memb的长度与网络节点数完全一致(实际数据中需重点检查); - 大型网络优化:先抽取小部分节点测试模型,确认公式和参数无误后,再运行全量数据;必要时可通过
memory.limit(size = ...)调整R的内存分配上限。
内容的提问来源于stack exchange,提问作者Christophe Lesschaeve
相关产品推荐
相关产品推荐

