【数据分析】中介效应的简介、模型、python代码实现以及数据可视化

当谈到因果关系时,中介效应是一种非常重要的概念。中介效应发生在一个变量(中介变量)部分地中介了另外两个变量之间的关系。

什么是中介效应?

中介效应发生在以下情况下:

一个变量(中介变量)部分地中介了另外两个变量之间的关系。假设自变量X对因变量Y产生了影响,而这种关系是通过中介变量M传递的。这种中介效应可以通过如下的公式来计算:

Mediated = \beta _X \times \beta_M

其中,\beta_X是自变量X对中介变量M的回归系数,\beta_M是中介变量M对因变量Y的回归系数。这个公式告诉我们,中介变量M部分地中介了自变量X和因变量Y之间的关系。

如何计算中介效应?

我们可以使用statsmodels库来计算中介效应。为了说明这一点,我们可以参考以下模型:

Y = \beta _0+\beta _1X+\beta _2M+\epsilon _1

M = \gamma _0+\gamma _1X+\epsilon _2

在这个模型中,X是自变量,M是中介变量,Y是因变量,使用OLS回归模型来拟合这个模型,并计算中介效应。下面是计算中介效应的示例代码:

import pandas as pd
import statsmodels.api as sm
import numpy as np
import matplotlib.pyplot as plt

#读取数据,读取各个变量
data = pd.read_csv("mediation_data.csv")
X = data["X"].values.reshape(-1, 1)
M = data["M"].values.reshape(-1, 1)
Y = data["Y"].values.reshape(-1, 1)

# 标准化
X = sm.add_constant(X)
M = sm.add_constant(M)
X_scaled = (X - X.mean()) / X.std()
M_scaled = (M - M.mean()) / M.std()
Y_scaled = (Y - Y.mean()) / Y.std()

# 拟合回归模型
reg = sm.OLS(Y_scaled, X_scaled).fit()

# 拟合中介效应模型
med = sm.OLS(M_scaled, X_scaled).fit()
med_y = sm.OLS(Y_scaled, sm.add_constant(med.predict(X_scaled))).fit()

# 计算中介效应和总效应
indirect = med.params[1] * med_y.params[1]
direct = reg.params[1]
total = direct + indirect

print("中介效应:", indirect)
print("总效应:", total)

# 绘制路径图
fig, ax = plt.subplots()
sc = ax.scatter(X_scaled[:,1], Y_scaled, c=M_scaled[:,1], cmap='viridis', alpha=0.5)
plt.colorbar(sc)
fit_x = np.linspace(X_scaled[:,1].min(), X_scaled[:,1].max(), 100).reshape(-1,1)
fit_M = np.array([0.5] * len(fit_x)).reshape(-1,1)
fit_X = sm.add_constant(fit_x)
fit_M = sm.add_constant(fit_M)
fit_X_scaled = (fit_X - X.mean()) / X.std()
fit_M_scaled = (fit_M - M.mean()) / M.std()
fit_Y_pred = reg.predict(fit_X_scaled)
med_Y_pred = med_y.params[0] + med_y.params[1] * med.predict(fit_X_scaled)
ax.plot(fit_x, fit_Y_pred, label='Y', linewidth=2)
ax.plot(fit_x, med_Y_pred, label='M->Y', linewidth=2)
ax.legend()
plt.xlabel('X')
plt.ylabel('Y/M')
plt.show()

在这里,如果没有相关数据可以让我们去运行模型的话,我们可以考虑使用随机生成一个简单的可以用来计算中介效应的数据集,该数据集包含三个变量:自变量X、中介变量M和因变量Y。M = 0.5 * X + e,其中e是从均值为0,标准差为0.5的正态分布中生成的随机噪声,Y是根据X和M生成的,具体地,Y = 2 * X + 0.5 * M + e,其中e是从均值为0,标准差为1的正态分布中生成的随机噪声。

import numpy as np
import pandas as pd


np.random.seed(123)

# 随机生成
X = np.random.normal(size=100)
M = 0.5 * X + np.random.normal(0, 0.5, 100)
Y = 2 * X + 0.5 * M + np.random.normal(0, 1, 100)

# 建立dataframe
data = pd.DataFrame({'X': X, 'M': M, 'Y': Y})

data.to_csv('mediation_data.csv', index=False)

这个数据集是一个简单的中介效应数据集,其中自变量X影响因变量Y,同时也影响中介变量M。中介变量M也影响因变量Y,但是这种影响是通过自变量X间接产生的。因此,自变量X对因变量Y的总效应包括两部分,一部分是直接效应(X -> Y),另一部分是间接效应(X -> M -> Y)。这个数据集可以用来演示中介效应的计算和可视化。

路径图可以展示模型中自变量、中介变量、因变量之间的关系,以及模型拟合的结果。在这个由随机数据集生成的路径图中,横轴代表自变量X,纵轴代表因变量Y和中介变量M,散点图中颜色代表中介变量M的取值,蓝色的线代表自变量X对因变量Y的直接影响路径,橙色的线代表自变量X对中介变量M的直接影响路径,绿色的线代表中介变量M对因变量Y的影响路径,路径上的数字表示相应的系数估计值。

一起尝试运行吧!( ̄︶ ̄)↗ 

 

  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值