最近觉得自己做的二阶结构方程模型过于花哨,想改成最基础的中介模型。中介模型曾经用Rstudio里mediation包做过,所以没什么困难。
然后尴尬的地方就来了,mediation包计算的结果不报告标准化回归系数。网上也有人说R对标准化回归系数不友好,好吧,就是被歧视了呗。
既然不给我,我就自己算。
##先把数据“无中生有”##
n <- 50
X <- rnorm(n,40,12)
a <- 0.40
M <- a*X+rnorm(n,0,0.5)
b <- 0.35
cdash <- 0.1
Y <- cdash*X+b*M+rnorm(n,0,0.5)
my_data <- data.frame(X,M,Y)
##中介模型##
library("mediation")
a_regression <- lm(M~X,data = my_data)
b_regression <- lm(Y~X+M,data = my_data)
c_regression <- lm(Y~X,data = my_data)
c2_regression <- lm(Y~X+M,data = my_data)
contcont <- mediate(a_regression,b_regression,treat = "X",
mediator = "M",boot = TRUE,
boot.ci.type = "bca",sims = 5000)
summary(contcont)
Causal Mediation Analysis
Nonparametric Bootstrap Confidence Intervals with the BCa Method
Estimate 95% CI Lower 95% CI Upper p-value
ACME 0.1236 0.0529 0.23 0.0036 **
ADE 0.1182 0.0126 0.19 0.0236 *
Total Effect 0.2419 0.2276 0.26 <2e-16 ***
Prop. Mediated 0.5111 0.2186 0.94 0.0036 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Sample Size Used: 50
Simulations: 5000
因为是自己编出来的数据,可能会拟合后出现不显著的情况,如果遇到就重新生成一套(反正吹牛不花钱)。我就是第二轮才成的。
言归正传,在结果里确实看不到标准化回归系数的结果。百度检索相关关键词,看到知乎上有人解答了,《回归模型中的标准化回归系数是什么,该如何计算得到?——by 医小咖》
https://zhuanlan.zhihu.com/p/164970155
在这篇文章里,作者给出了两个重要公式:
每变化1个标准差的回归系数 = 未标准化回归系数 * 该自变量的标准差
标准化回归系数 = 未标准化回归系数 * 该自变量的标准差 / 因变量的标准差
那么接下来检验一下对不对。
##提取非标准化回归系数a##
a_coeff <- summary(a_regression)$coefficients
a_coeff
a_coeff[2,1]
[1] 0.3999142
##计算##
a_coeff[2,1]*sd(X)/sd(M)
[1] 0.9945679
##同理,计算b和c##
b_coeff <- summary(b_regression)$coefficients
b_coeff
b_coeff[3,1]
[1] 0.3091171
b_coeff[3,1]*sd(M)/sd(Y)
[1] 0.5053385
c2_coeff <- summary(c2_regression)$coefficients
c2_coeff
c2_coeff[2,1]
[1] 0.1182374
c2_coeff[2,1]*sd(X)/sd(Y)
[1] 0.4807086
##结果汇总##
X → M非标准化 & 标准化:0.400 & 0.995
M → Y非标准化 & 标准化:0.309 & 0.505
X → Y非标准化 & 标准化:0.118 & 0.481
接下来验算一下,用lavaan包拟合结构方程模型,其中Std.lv为非标准化,Std.all为标准化。
经过对照可以看出结果是一致的。
library("lavaan")
model <- '
Y~c2*X
M~a*X
Y~b*M
ab:=a*b
total:=c2+(a*b)
'
fit <- sem(model,data = my_data)
fit <- sem(model,data = my_data,se="bootstrap",bootstrap=5000)
summary(fit, fit.measures = TRUE,standardize=TRUE,rsquare = TRUE)
##截取主要结果##
Regressions:
Estimate Std.Err z-value P(>|z|)
Y ~
X (c2) 0.118 0.044 2.677 0.007
M ~
X (a) 0.400 0.006 66.797 0.000
Y ~
M (b) 0.309 0.110 2.805 0.005
Std.lv Std.all
0.118 0.481
0.400 0.995
0.309 0.505
这时候我忽然问自己,为什么不一开始直接就用lavaan包计算呢?
因为一开始觉得mediation包可以提供ACME间接效应(ab),ADE直接效应(c'也就是c2)和Total effect总效应(c)的结果。折腾了一大圈发现,用lavaan包算出来的非标准化系数也能用来算上面这些效应。真是哭笑不得。
而且,我还在网上找到一个叫做QuantPsyc的包,可以直接算标准化回归系数,不过遗憾的是不能在R里直接下载。
国外的网友形容这个功能短小精悍(The function is short and sweet),我把包的公式扒下来了。虽然不能完全看懂,但是大概感觉和上面知乎文章里的公式一致,说明这个公式还是正确的,也算是找到了半个出处吧。
本来试图推导这个公式,或者找到公式的出处,感觉有些难,以后再说吧。
>lm.beta
function (MOD)
{
b <- summary(MOD)$coef[-1, 1]
sx <- sd(MOD$model[-1])
sy <- sd(MOD$model[1])
beta <- b * sx/sy
return(beta)
}
参考资料:
温忠麟, & 叶宝娟. (2014). 中介效应分析:方法和模型发展. 心理科学进展, 22(005), 731-745.
https://zhuanlan.zhihu.com/p/164970155《回归模型中的标准化回归系数是什么,该如何计算得到?》
https://www.r-bloggers.com/2010/11/example-8-14-generating-standardized-regression-coefficients/#:~:text=Standardized%20%28or%20beta%29%20coefficients%20from%20a%20linear%20regression,standardized%20post-hoc%20based%20on%20the%20appropriate%20standard%20deviations.《generating standardized regression coefficients》
https://blog.csdn.net/huangyouyu523/article/details/78565159《R语言做如何做多元回归分析(逐步回归)之 提取回归结果参数-调整R方,标准化回归系数》
https://www.zhihu.com/question/312961041/answer/1159685698《使用R 语言mediation 包做中介效应分析,结果输出中的ACME 和ADE 分别代表什么?》