因果图模型与python验证

因果网络有三种基本类型或形式。

1.A→B→C

这种接合形式是被称为链”接合或中介接合的最简单的表现形式。一个熟悉的例子是“火灾→烟雾→警报”。虽然称这个系统为“火灾警报”,但实际上它应该叫烟雾报警。火灾本身并没有引起警报,所以这里也就没有从火灾直接指向警报的箭头。只有火灾向空气中释放的烟雾分子才会触发警报。

这个观察引出了关于链接合的一个重要概念点:中介物 B“屏蔽 screen off )了从 A C 的信息或从 C A 的信息,即A与C本来是有相关关系的,但是如果控制了B,A与C的相关关系就消失了。
一个结论必须提出,否则可能引来疑惑,那就是: 把变量放进回归方程,就相当于控制了这个变量。下面以python代码说明。
##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

这种接合形式被称为 接合, B通常被视作AC的共因(common cause)或混杂因子(confounder 。混杂因子会使 A和C在统计学上发生关联,即使它们之间并没有直接的因果关系。一个经典的例子,“鞋的尺码←孩子的年龄→阅读能力”。穿较大码的鞋的孩子往往阅读能力较强。但这种关系是非因果的——给孩子穿大一号的鞋不会让他有更强的阅读能力!相反,这两个变量的变化都可以通过第三个变量,即孩子的年龄来解释。越年长的孩子鞋码越大,他们的阅读能力也越强。
python代码。
##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

这被称作 “ 对撞 collider)接合。一个典型的例子是才华→名人←美貌。在此,我们认定才华和美貌都有助于演员的成功,但对于一般人而言,美貌和才华完全不相关。
python代码。
##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、非线性

以上是基于线性关系对因果和相关做了分析和对比。从因果的角度,不管是线性还是非线性关系都是一样的,三种因果结构的性质也应该是一样的。

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值