SAS PROC MIXED模型替换因变量后最小二乘均值差异一致的原因咨询
嗨,我来帮你拆解这个问题——其实这两种模型设定下最小二乘(LS)均值差异完全一致,是有明确的统计逻辑的,咱们从模型本质和代码验证两方面说清楚:
一、模型层面的核心原因
首先咱们明确变量关系:你定义的chg应该是aval - base(从基线的变化值),那咱们把两个模型展开来看:
第一个模型(因变量为
aval):model aval = base arm avisitn arm*avisitn /s ;本质是拟合:
$$aval = \beta_0 + \beta_1 \times base + \beta_2 \times arm + \beta_3 \times avisitn + \beta_4 \times arm \times avisitn + b_{subject} + \varepsilon$$
其中$b_{subject}$是随机效应,$\varepsilon$是残差。第二个模型(因变量为
chg):model chg = base arm avisitn arm*avisitn /s;代入
chg = aval - base后,等价于拟合:
$$aval = \gamma_0 + (1+\gamma_1) \times base + \gamma_2 \times arm + \gamma_3 \times avisitn + \gamma_4 \times arm \times avisitn + c_{subject} + \varepsilon'$$
你关注的是arm在特定avisitn下的LS均值差异,比如当avisitn=k时,两组arm的差异是:
- 第一个模型:$\beta_2 + \beta_4 \times k$
- 第二个模型:$\gamma_2 + \gamma_4 \times k$
而统计上,这两个差异是完全相等的——因为base作为协变量,它的系数($\beta_1$和$\gamma_1$)只会影响模型的截距和base的效应,不会改变arm主效应和arm*avisitn交互效应的估计值。换句话说,arm组间的相对差异,在这两个线性转换的模型里是完全一致的。
再直白点说:LS均值是调整到协变量(这里是base)均值后的估计值,aval的LS均值 = chg的LS均值 + base的均值,所以两组arm的差异会抵消掉base均值的部分,最终结果完全相同。
二、代码层面的验证建议
你可以通过输出LS均值并对比,直观看到这个规律,修改后的代码如下:
1. 第一个模型(输出LS均值)
proc mixed data=inds; class subject arm(ref='C') ; model aval =base arm avisitn arm*avisitn /s ; random subject ; repeated / subject=subject ; lsmeans arm / diff cl at avisitn=0; lsmeans arm / diff cl at avisitn=1; lsmeans arm / diff cl at avisitn=2; ods output diffs=diff lsmeans=ls_aval; /* 新增输出LS均值 */ run;
2. 第二个模型(输出LS均值)
proc mixed data=inds; class subject arm(ref='C') ; model chg =base arm avisitn arm*avisitn /s; random subject ; repeated / subject=subject ; /* lsmeans arm / pdiff cl at avisitn=0;*/ lsmeans arm / pdiff cl at avisitn=1; lsmeans arm / pdiff cl at avisitn=2; ods output diffs=diff1 lsmeans=ls_chg; /* 新增输出LS均值 */ run;
3. 验证LS均值的关系
先计算base的均值,再对比两个模型的LS均值:
/* 计算base的均值 */ proc means data=inds noprint; var base; output out=base_stats mean=mean_base; run; /* 合并并验证 */ data ls_compare; set ls_aval rename=(lsmean=lsmean_aval) ls_chg rename=(lsmean=lsmean_chg); by arm avisitn; set base_stats; /* 计算chg的LS均值加上base均值,应该等于aval的LS均值 */ lsmean_chg_plus_base = lsmean_chg + mean_base; run; /* 打印对比结果 */ proc print data=ls_compare; var arm avisitn lsmean_aval lsmean_chg_plus_base; title "对比aval和chg的LS均值(chg+base均值)"; run;
运行后你会发现:lsmean_aval和lsmean_chg_plus_base几乎完全相等(浮点误差忽略),而它们的组间差异自然也完全一致。
这样解释应该能帮你彻底理解啦,本质就是线性转换加上协变量调整的一致性导致的结果~
备注:内容来源于stack exchange,提问作者XixiHaha

