变量缩放后p值为何变化?混合模型技术疑问
我用以下代码构建线性混合模型:
m2 <- lmer(SE ~ b95rel*MF*TASK*ROI*side*Run + (1|IDcheck),f)
其中:
SE、b95rel、MF为连续变量TASK、ROI、side、Run为分类变量
运行后收到警告:
Warning messages:
1: Some predictor variables are on very different scales: consider rescaling
当我用R的scale()函数缩放b95rel后,模型的p值发生了变化(比如主效应TASK从不显著变为显著);进一步缩放MF后,p值再次变化。
我之前了解到变量缩放不应改变p值,对此感到困惑。可视化显示缩放仅改变轴值,数据相对距离未变,排除了该因素的影响。目前因数据量过大无法提供dput()输出,以下是我的sessionInfo:
> sessionInfo() R version 4.2.2 (2022-10-31 ucrt) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 19044) Matrix products: default locale: [1] LC_COLLATE=English_Canada.utf8 LC_CTYPE=English_Canada.utf8 LC_MONETARY=English_Canada.utf8 [4] LC_NUMERIC=C LC_TIME=English_Canada.utf8 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] rstatix_0.7.2 ggpubr_0.6.0 lubridate_1.9.2 forcats_1.0.0 stringr_1.5.0 dplyr_1.1.1 [7] purrr_1.0.1 readr_2.1.4 tidyr_1.3.0 tibble_3.2.1 ggplot2_3.4.2 tidyverse_2.0.0 [13] sjmisc_2.8.9 sjPlot_2.8.14 MuMIn_1.47.5 lmerTest_3.1-3 lme4_1.1-32 Matrix_1.5-4 [19] sjstats_0.18.2 emmeans_1.8.5 loaded via a namespace (and not attached): [1] splines_4.2.2 carData_3.0-5 modelr_0.1.11 datawizard_0.7.1 stats4_4.2.2 [6] bayestestR_0.13.1 numDeriv_2016.8-1.1 pillar_1.9.0 backports_1.4.1 lattice_0.20-45 [11] glue_1.6.2 RColorBrewer_1.1-3 ggsignif_0.6.4 minqa_1.2.5 colorspace_2.1-0 [16] sandwich_3.0-2 pkgconfig_2.0.3 broom_1.0.4 haven_2.5.2 xtable_1.8-4 [21] mvtnorm_1.1-3 scales_1.2.1 tzdb_0.3.0 timechange_0.2.0 farver_2.1.1 [26] generics_0.1.3 car_3.1-2 sjlabelled_1.2.0 TH.data_1.1-1 withr_2.5.0 [31] cli_3.4.1 effectsize_0.8.3 survival_3.4-0 magrittr_2.0.3 estimability_1.4.1 [36] fansi_1.0.4 nlme_3.1-160 MASS_7.3-60 tools_4.2.2 hms_1.1.3 [41] lifecycle_1.0.3 multcomp_1.4-23 munsell_0.5.0 ggeffects_1.2.2 compiler_4.2.2 [46] rlang_1.1.0 grid_4.2.2 nloptr_2.0.3 parameters_0.20.3 rstudioapi_0.14 [51] labeling_0.4.2 boot_1.3-28 gtable_0.3.3 codetools_0.2-18 abind_1.4-5 [56] R6_2.5.1 zoo_1.8-11 knitr_1.42 performance_0.10.3 utf8_1.2.3 [61] insight_0.19.1 stringi_1.7.12 Rcpp_1.0.10 vctrs_0.6.1 tidyselect_1.2.0 [66] xfun_0.38 coda_0.19-4
请问为何缩放变量后p值会发生变化?
出现这种情况主要有以下几个核心原因:
高阶交互项改变了主效应的定义
你的模型包含b95rel*MF*TASK*ROI*side*Run全阶交互,此时主效应(如TASK)表示的是其他所有变量处于参考水平时的效应。未缩放时,连续变量的参考水平是原始0值;而scale()默认将连续变量中心化到均值为0,这直接改变了主效应的实际含义,对应的p值自然会变化。原始模型存在数值不稳定问题
变量尺度差异极大时,lme4拟合模型可能出现矩阵求逆精度下降、优化算法收敛到局部最优解等数值不稳定情况。缩放后变量尺度趋于一致,拟合过程更稳定,得到的参数估计及p值更可靠——本质是原始模型的估计本身存在偏差,缩放后纠正了这一问题。lmerTest的p值计算依赖参数估计精度
你使用lmerTest包通过Satterthwaite或Kenward-Roger方法近似自由度计算p值。当原始模型因尺度问题导致参数标准误不稳定时,这些近似方法得出的p值会有偏差;缩放后参数估计更稳定,标准误计算更准确,p值随之变化。“缩放不改变p值”的适用范围有限
你之前了解的结论仅适用于无交互项的线性模型:此时缩放连续变量仅改变系数大小,t值(系数/标准误)保持不变,p值也不变。但加入交互项后,尤其是连续与分类变量的交互,缩放会改变交互项系数,进而影响主效应的检验结果。
内容的提问来源于stack exchange,提问作者Ang

