使用pymer4进行事后分析时报错:Variable 'latency' is not in the dataset
使用pymer4进行事后分析时报错:Variable 'latency' is not in the dataset
看起来你遇到的问题根源很可能是事后分析时指定的变量和模型/数据集不匹配,咱们一步步拆解问题:
先看你的代码细节:
- 拟合混合模型时,公式里用的因变量是
latency,但调用post_hoc方法时却传了marginal_vars="ln_Latency"——而你的样本数据里根本没有ln_Latency这个列,这就导致pymer4调用的R后端emtrends函数找不到对应变量,进而抛出了报错。
解决方案分两种情况:
情况1:你不需要对数转换,只是参数写错了
直接把marginal_vars改成模型里实际使用的latency即可:
marginal_estimates, comparisons = model.post_hoc( marginal_vars="latency", grouping_vars="Velocity", p_adjust='bonf' )
情况2:你确实需要基于对数转换后的latency做分析
那得先在数据集中生成对数转换后的列,再重新拟合模型,最后执行事后分析:
import numpy as np # 第一步:添加对数转换后的latency列 df['ln_Latency'] = np.log(df['latency']) # 第二步:用新列重新拟合模型 model = Lmer(formula='ln_Latency~ C(Velocity) + (1|subject)', data=df) model.fit(factors={"Velocity": ["16","24","32","40"]}, ordered=True,summarize=True) # 第三步:基于新列做事后分析 marginal_estimates, comparisons = model.post_hoc( marginal_vars="ln_Latency", grouping_vars="Velocity", p_adjust='bonf' )
额外排查小技巧:
- 可以先打印数据集的列名确认:
print(df.columns),确保你指定的变量确实存在,还要注意大小写差异(比如Latency和latency会被识别为两个不同变量)。 - 检查模型拟合过程中有没有不小心过滤或修改了数据集,导致
latency列丢失——不过你模型公式里用了这个列且拟合成功,说明当时该列是存在的,所以大概率是post_hoc的参数写错了。
备注:内容来源于stack exchange,提问作者Lym Lin
相关产品推荐
相关产品推荐

