使用plspm包执行分组分析时持续报错求助
解决plspm分组bootstrap时的"missing value where TRUE/FALSE needed"报错
问题描述
使用plspm包执行PLS-PM基础分析正常,但调用plspm.groups()并指定method = "bootstrap"时触发报错:
Error in if (w_dif < specs$tol || iter == specs$maxiter) break : missing value where TRUE/FALSE needed
已完成排查:
- 数据无缺失值
- 变量分类正确
- 已删除值完全相同的观测
- 使用
permutation方法执行分组分析无异常
相关代码:
farmwood = read.csv("farmwood_groups(distance).csv", header = TRUE) %>% slice(-c(119:123)) Control = c(0,0,0,0,0,0) Normative = c(0,0,0,0,0,0) B_beliefs = c(0,0,0,0,0,0) P_control = c(1,0,0,0,0,0) S_norm = c(0,1,0,0,0,0) Behavior = c(0,0,1,1,1,0) farmwood_path = rbind(Control, Normative, B_beliefs, P_control, S_norm, Behavior) colnames(farmwood_path) = rownames(farmwood_path) farmwood_blocks = list(14:18,20:23,8:13,24:27,19,4:7) farmwood_modes = rep("A", 6) farmwood_pls = plspm(farmwood, farmwood_path, farmwood_blocks, modes = farmwood_modes) names(farmwood)[names(farmwood) == "QB3"] <- "Distance" farmwood$Distance <- as.factor(farmwood$Distance) distance_boot = plspm.groups(farmwood_pls, farmwood$Distance, method = "bootstrap") distance_perm = plspm.groups(farmwood_pls, farmwood$Distance, method = "permutation")
可能的解决方案
1. 检查分组样本量
bootstrap抽样时,若某分组样本量过小,易导致迭代过程中出现NA值。先查看分组分布:
table(farmwood$Distance)
若存在小样本分组,可调整bootstrap参数:
# 自定义抽样次数和样本比例 distance_boot = plspm.groups(farmwood_pls, farmwood$Distance, method = "bootstrap", bootstrap = list(iter = 500, size = 0.8))
2. 验证分组模型的识别性
基础模型正常不代表每个分组的模型都能稳定运行,单独对每个分组测试:
groups_split = split(farmwood, farmwood$Distance) for (g in names(groups_split)) { cat("分组:", g, "\n") try(plspm(groups_split[[g]], farmwood_path, farmwood_blocks, modes = farmwood_modes)) }
若某分组运行报错,需针对该组调整模型或数据。
3. 调整收敛参数
报错出现在收敛判断环节,可放宽收敛阈值或增加最大迭代数后重新运行:
# 重新定义模型收敛参数 farmwood_pls = plspm(farmwood, farmwood_path, farmwood_blocks, modes = farmwood_modes, specs = plspm.specs(tol = 1e-4, maxiter = 1000)) distance_boot = plspm.groups(farmwood_pls, farmwood$Distance, method = "bootstrap")
4. 标准化显变量
变量量纲差异或极端值可能引发数值不稳定,标准化后重试:
# 对分组变量外的所有显变量标准化 farmwood_scaled = farmwood %>% mutate(across(-Distance, scale)) # 重新运行模型和分组bootstrap farmwood_pls_scaled = plspm(farmwood_scaled, farmwood_path, farmwood_blocks, modes = farmwood_modes) distance_boot_scaled = plspm.groups(farmwood_pls_scaled, farmwood_scaled$Distance, method = "bootstrap")
内容的提问来源于stack exchange,提问作者Jameshannay
相关产品推荐
相关产品推荐

