在R中检验线性假设:推理正确性及流程解析
含分类变量与交互项的析因模型线性假设检验问题
在含分类变量与交互项的析因模型中检验线性假设时,从业者常因参考水平的设置遇到困难。部分从业者会用relevel()或factor()函数重新设定参考水平,再重新运行模型,从新模型的摘要结果中推断特定组间差异——这种方法虽然直观易懂,但并非最优方案。另一方面,car包的linearHypothesis()函数和brms包的hypothesis()函数是更高效的工具,但仍有不少从业者因对其使用逻辑不熟悉而避而不用。
示例数据集
以下是用于演示的模拟数据集生成代码:
# 均匀生成均值 m = runif(8, 3, 12) # 生成带随机均值、相同标准差的随机值 y = list() for (i in 1:8) { y[[i]] = rnorm(50, m[i], 0.75) } y = unlist(y) # 析因设计 F1 = c(rep('a', 50), rep('b', 50)) F2 = c('m', 'n') F3 = c('x', 'y') design_matrix = expand.grid(F1=F1, F2=F2, F3=F3) # 数据集 dat = cbind(design_matrix, y)
贝叶斯框架(brms)的检验实现
首先用brms拟合模型:
library(brms) summary(brm_model <- brm(y ~ (F1 + F2) * F3, data = dat, chains=1, iter=800)) # 快速收敛
为检验F1=b在F3的x与y条件下的差异,当前采用的显式检验代码如下:
hy1 = '(Intercept+F1b) < (Intercept+F1b:F3y)' hypothesis(brm_model, hy1)
对应的推理逻辑:模型的估计值均是相对于截距(Intercept)的偏移量,高阶交互项也是对参考水平的直接调整,因此不需要额外添加低阶主效应(比如错误的写法(Intercept+F3y+F1b:F3y))。
频率论框架(lm+car)的检验实现
频率论框架下的等效模型拟合代码:
summary(lm_model <- lm(y ~ (F1 + F2) * F3, data = dat))
对应的线性假设检验代码:
library(car) linearHypothesis(lm_model, c(0,-1,0,0,1,0))
对应的推理逻辑:由于对比的两侧都需要加上截距项,截距的系数会相互抵消(-1+1=0),因此检验向量的第一个元素设为0。
核心疑问
上述推理逻辑是否正确?在此类情境下,应如何解释组间比较与线性假设检验的完整流程?
内容的提问来源于stack exchange,提问作者striatum
相关产品推荐
相关产品推荐

