使用simr包时powerSim/powerCurve全报错,逆高斯log模型奇异拟合求助
问题诊断与解决方案
核心问题拆解
- 奇异拟合本质:你的模型里
Subject随机截距的方差接近0(1.139e-12),说明个体间反应时的差异可以忽略,混合模型的随机效应部分完全没必要,导致模型卡在拟合边界(singular fit)。 - 效应被噪声淹没:
DistancePower的估计值(-0.117)对应的标准误大得离谱(1.286),t值仅-0.091,p值0.927——预实验数据里这个效应根本没被检测到。simr是基于现有模型参数模拟数据,效应量过小且噪声极大时,模拟中自然也找不到显著结果,所以效能全是0%。 - 错误的效应调整:你手动把
DistanceBase和DistancePower的效应乘以0.9,进一步缩小了本就不显著的效应,相当于给检测难度“火上浇油”。
分步解决办法
1. 处理奇异拟合
- 先砍掉随机效应,改用普通广义线性模型(
glm)试试:
如果拟合正常,说明你的数据根本不需要混合模型结构,用glm做效能分析更合理。model_glm <- glm(RT ~ Compatibility + DistanceBase + DistancePower, family=inverse.gaussian(link="log"), data = df) summary(model_glm) - 非要用混合模型的话:
- 先清理异常值(比如残差最大值10.01,大概率是极端数据拖垮了拟合),再重新建模。
- 换个优化器试试,比如
optimizer="bobyqa",同时降低nAGQ值(比如设为1),先保证模型能稳定收敛。
2. 设定合理的效应量
simr的效能分析靠的是有实际意义的效应量,你当前预实验的效应被噪声盖过了,不能当基准:
- 要是有文献或前期研究支持的理论效应量,直接替换模型里的固定效应值,别用预实验的无显著结果:
# 示例:假设理论上DistancePower的效应是-0.5,替换成你的实际预期值 fixef(model1)["DistancePower"] <- -0.5 - 没理论依据的话,先增大预实验样本量,先得到能检测到显著效应的参数估计,再做效能分析。
3. 调整simr参数
- 把
nsim调大到100或200,你现在设的10次模拟结果方差极大,完全不可信。 - 如果改用glm,就别用
along="Subject"了,直接基于总样本量扩展(along="n")。
4. 再验证模型适配性
你觉得逆高斯log连接最适配,但奇异拟合和超大标准误可能说明模型仍有问题:
- 检查残差分布,确认逆高斯分布是不是真的适合你的数据。
- 试试其他连接函数(比如
identity)或分布族(比如伽马分布),对比AIC和残差情况。
修正后的示例代码
# 示例:移除残差极端值(绝对值大于3倍标准差) df_clean <- df[abs(rstandard(model1)) < 3, ] # 改用普通glm(如果随机效应无意义) model_glm <- glm(RT ~ Compatibility + DistanceBase + DistancePower, family=inverse.gaussian(link="log"), data = df_clean) # 替换为理论预期的效应量 fixef(model_glm)["DistancePower"] <- -0.5 # 扩展总样本量并计算效能 model_ext <- extend(model_glm, n=500) pc <- powerCurve(model_ext, fixed("DistancePower"), along="n", nsim=100) print(pc)
内容的提问来源于stack exchange,提问作者N Neumann
相关产品推荐
相关产品推荐

