1.A→B→C。
这种接合形式是被称为“链”接合或中介接合的最简单的表现形式。一个熟悉的例子是“火灾→烟雾→警报”。虽然称这个系统为“火灾警报”,但实际上它应该叫烟雾报警。火灾本身并没有引起警报,所以这里也就没有从火灾直接指向警报的箭头。只有火灾向空气中释放的烟雾分子才会触发警报。
##1、链式因果结构:x->y->z,生成过程即因果图
x = np.random.normal(10,2,100)
y = 1*x + np.random.normal(2,1,100)
z = 1*y + np.random.normal(2,1,100)
corr_coef = np.corrcoef(x, y)[0][1]
print("x corr y:",corr_coef)
corr_coef = np.corrcoef(y, z)[0][1]
print("y corr z:",corr_coef)
corr_coef = np.corrcoef(x, z)[0][1]
print("x corr z:",corr_coef)
data = {"x":x,"y":y,"z":z}
df = pd.DataFrame(data)
regressor = LinearRegression()
##1.1 z为因变量,建立多元回归模型。多元回归模型系数是偏相关系数,即控制了其他变量的相关系数
X=df[["x","y"]]
Y=df["z"]
regressor.fit(X,Y)
##1.1.1 第一个系数,x的系数含义为:控制y(保持y不变),x变动1个单位,z跟随变动的单位;
##1.1.2 第二个系数,y的系数含义为:控制x(保持x不变),y变动1个单位,z跟随变动的单位;
print("z为因变量,regressor.coef_:",regressor.coef_)
结果:
x corr y: 0.8951290027644204
y corr z: 0.9209725906720255
x corr z: 0.8110883398012639
z为因变量,regressor.coef_: [-0.08111816 1.0178386 ]
如果不控制y,x与z的相关系数为0.81。但当建立回归方程z = ax+by+c时(系数a相当于控制y后,x与z的相关系数,即偏相关系数,此时a为-0.08),显示x与z不相关。(严格来说应该看系数显著性,但样本量为100,-0.08可以认为不相关),即控制中介变量B,屏蔽了A与C之间的信息,阻断了A和C的相关性。
从干预的角度上讲,链式结构中调整A不如调整B对改变C来的直接,但也能起到作用。比如加大或减小火灾的程度,会(通过烟雾浓度)影响警报。
2.A←B→C。
##1、叉式因果结构:x<-y->z,生成过程即因果图
y = np.random.normal(10,2,100)
z = 1*y + np.random.normal(2,1,100)
x = 1*y + np.random.normal(2,1,100)
corr_coef = np.corrcoef(x, y)[0][1]
print("x corr y:",corr_coef)
corr_coef = np.corrcoef(y, z)[0][1]
print("y corr z:",corr_coef)
corr_coef = np.corrcoef(x, z)[0][1]
print("x corr z:",corr_coef)
data = {"x":x,"y":y,"z":z}
df = pd.DataFrame(data)
regressor = LinearRegression()
##1.1 z为因变量,建立多元回归模型。多元回归模型系数是偏相关系数,即控制了其他变量的相关系数
X=df[["x","y"]]
Y=df["z"]
regressor.fit(X,Y)
##1.1.1 第一个系数,x的系数含义为:控制y(保持y不变),x变动1个单位,z跟随变动的单位;
##1.1.2 第二个系数,y的系数含义为:控制x(保持x不变),y变动1个单位,z跟随变动的单位;
print("z为因变量,regressor.coef_:",regressor.coef_)
结果:
x corr y: 0.9159864301361077
y corr z: 0.9035629672460023
x corr z: 0.8176188271277054
z为因变量,regressor.coef_: [-0.06251823 1.03257116]
如果不控制y,x与z的相关系数为0.81,但他们之间没有直接或间接的因果关系。当建立回归方程z = ax+by+c时(系数a相当于控制y后,x与z的相关系数,此时a为-0.06),显示x与z不相关,消除了x与z的假因果关系。即控制共因/混杂变量B,消除了A与C之间假因果和相关关系。在科学研究中,混杂和去混杂是一个很重要的话题。
3.A→B←C 。
##1、对撞因果结构:x->y<-z,生成过程即因果图
x = np.random.normal(10,2,100)
z = np.random.normal(10,2,100)
y = 1*z +1*x + np.random.normal(2,1,100)
corr_coef = np.corrcoef(x, y)[0][1]
print("x corr y:",corr_coef)
corr_coef = np.corrcoef(y, z)[0][1]
print("y corr z:",corr_coef)
corr_coef = np.corrcoef(x, z)[0][1]
print("x corr z:",corr_coef)
data = {"x":x,"y":y,"z":z}
df = pd.DataFrame(data)
regressor = LinearRegression()
##1.1 z为因变量,建立多元回归模型。多元回归模型系数是偏相关系数,即控制了其他变量的相关系数
X=df[["x","y"]]
Y=df["z"]
regressor.fit(X,Y)
##1.1.1 第一个系数,x的系数含义为:控制y(保持y不变),x变动1个单位,z跟随变动的单位;
##1.1.2 第二个系数,y的系数含义为:控制x(保持x不变),y变动1个单位,z跟随变动的单位;
print("z为因变量,regressor.coef_:",regressor.coef_)
结果:
x corr y: 0.561852120831922
y corr z: 0.7588736406895573
x corr z: -0.031650685634159195
z为因变量,regressor.coef_: [-0.78856586 0.83925367]
如果不控制y,x与z的相关系数为-0.03,显示不相关。但当建立回归方程z = ax+by+c时(系数a相当于控制y后,x与z的相关系数,此时a为-0.78),显示x与z呈负相关,这也是典型的伪相关。这种负相关有时被称为对撞偏倚或“辩解”效应(explain-away effect)。
在一般的科学研究中,科研工作者倾向于控制所有能控制的变量,其实是不对的,遇到这种对撞结构的因果,应该做的是不控制。
4、相关和因果,预测和干预
如果目的是预测,而不干预,鉴于因果发现的复杂性和专业性,其实相关也有很大的意义,也能带来比较精准的预测,前提是数据分布没有太大变化,因为假相关对数据分布敏感,特别不稳健(这也是为什么很多机器学习模型要配合数据分布监测的原因,因为机器学习模型学习的是相关)。
如果目的是分析原因,并进行干预,那就要特别注意这些因果结构的特点,需要有专业、有经验的人去识别因果关系,数据则只是起到验证模型的作用。如果能发现因果,那么因果模型是稳健的,也是对业务提升最高效的途径。
5、非线性
以上是基于线性关系对因果和相关做了分析和对比。从因果的角度,不管是线性还是非线性关系都是一样的,三种因果结构的性质也应该是一样的。