農林漁牧網

您現在的位置是:首頁 > 農業

Python實現固定效應迴歸模型實現因果關係推斷

2022-02-21由 deephub 發表于 農業

固定模型怎麼變通

眾所周知,“相關並不意味著因果關係”。 我要告訴你,相關可以表示因果關係,但需要一定條件。 這些條件已在計量經濟學文獻中被廣泛討論。 在本文中,我將以一種易於理解的方式對其進行總結。 我將解釋如果不滿足這些條件為什麼標準的普通最小二乘(OLS)無法確定因果關係。 然後,我將介紹可以提供有效解決方案的固定效應(FE)模型。 之後,我將使用兩套資料分析示例向您展示如何在python中進行操作。 我希望本文能夠透過良好的設計和令人信服的結果增強您對因果關係的理解。

相關可以表示因果關係 — 僅在滿足某些條件時

Python實現固定效應迴歸模型實現因果關係推斷

讓我們給出因果關係的正式定義。 因果關係是x導致y。 關聯意味著x和y沿相同或相反的方向一起移動。 因果關係應滿足以下三個經典條件:

x必須在y之前發生

x必須與y相關

x和y之間的關係不能用其他原因解釋。

從相關性推斷因果關係是一件很難的事

Python實現固定效應迴歸模型實現因果關係推斷

在圖(A)中,冰淇淋銷量的增長與夏季鯊魚的襲擊密切相關。 您認為這有意義嗎? 這是一種關聯,但不是因果關係,因為並非以上三個條件中的所有條件都成立。 首先,鯊魚襲擊的次數不會隨著冰淇淋銷售的增加而增加。

其次,冰淇淋銷售量的增長與鯊魚襲擊之間的相關性可能始終存在,也可能不是始終存在。 第三,也是最重要的一點,兩個因素之間的關係可以用夏季來解釋。 實際上,炎熱的夏天是冰淇淋銷售量增加和鯊魚襲擊增加的驅動力。

混雜因素

Confounding Factor

):冰淇淋銷售量x和鯊魚襲擊次數y都受夏季熱量,混雜因素z的驅動,如圖(B)所示。 混雜因素是一個既影響因變數y又影響自變數x的變數,從而導致了虛假關聯。 一項研究可能會忽略混雜因素。 因為我們沒有收集足夠的資料,所以它是不可觀察的。 而補救措施是將混雜因素識別為可觀察的因素。

Python實現固定效應迴歸模型實現因果關係推斷

內生性

:如果存在一個混雜因素可以解釋x和y之間的關係,則x是內生的。x和y之間的相關性也無法解釋或毫無意義。 您能說冰淇淋銷售與鯊魚襲擊之間存在正相關關係嗎? 我們不應試圖從正號或負號得出任何結論。 事實是該係數可以更高,更低,甚至不同。

如何量化X對Y的影響?

為了衡量治療的效果,我們必須與沒有治療的事實進行比較。 換句話說,我們討論如果個人不接受治療會產生什麼結果。

隨機對照試驗(RCT)通常是非常好的標準

我們要怎麼解決這個難題呢? 隨機對照試驗(RCT)通常被視為非常好的標準,因為可以確定因果關係(Shadish et al,2002)。 如果我們可以將個體隨機分配到治療組和對照組,那麼兩組的個體特徵將大致相等。 那麼,治療效果就是兩組之間的y之差。

讓我用一種統計的方式來進行以上描述。 普通最小二乘(OLS)假設x與不可觀察項之間沒有相關性,即沒有內生性。 這可以用RCT中實現,因為隨機分配下不可能出現內生性或混雜問題。 在下式中描述了OLS,其中i是N個個體中每個個體的識別符號。 第二個方程是矩陣形式。 關鍵假設是E(X)= 0,這表示x與不可觀測項之間沒有相關性。 錯誤項可能是任何不可觀察的項。

Python實現固定效應迴歸模型實現因果關係推斷

但是,在大多數情況下進行RCT會不可行。 RCT可能很耗時,或很昂貴,或難以向需要合作的公眾解釋,並且有時是不道德的。 例如,在醫院中,研究人員可能會建議將患者保留為對照組。 這顯然不可行,因為該研究使患者處於危險之中。 並非所有決策問題或臨床實驗都可以遵循RCT。 那我們還有什麼辦法? 研究人員越來越依賴於準實驗設計並取得了令人信服的結果。 “準”一詞表面上看起來表示不是真的。 準實驗設計類似於隨機對照試驗,但沒有對研究者進行隨機分配(Cook&Campbell,1979)。

準實驗接近“一樣好”

RCT中無法進行大量研究。 因此,我們使用了準實驗設計,其中已曝光和未曝光單位之間的唯一區別是曝光本身。 典型的準實驗包括迴歸不連續性迴歸——Regression Discontinuity(RD),差異——Difference-in-differences(DiD)和固定效應模型——Fixed-Effects Model (FE)。

不連續性迴歸(RD)

RD設計將剛好高於和剛好低於閾值的物件進行比較,如圖(D)中“Before”方案中的綠色框所示。 預計綠色框中的主題非常相似。 在“After”場景中,正確的小組受到干預,結果有所不同。 結果的這種跳躍或不連續可以解釋為干預的結果。

Python實現固定效應迴歸模型實現因果關係推斷

在“After”期間(“ 1” =After)對Y的預期影響為E [Y(1)| X],而“Before”期間(“ 0” =Before)為E [Y(0)| X ]。 在小綠色框中,所有X都非常相似,因此,“之前”和“之後”期間的X被認為是相同的。 RD的結果接近RCT。

面板資料

Panel Data

):也稱為縱向或橫向時間序列資料。 在面板資料中,您擁有所有時間段內個人的資料點。 基本的面板資料迴歸模型類似於方程式(1),其中和是係數,而i和t是個體和時間的指標。 面板資料使您可以控制變數並說明各個變數的差異性。 有趣的是,在Python中使用Pandas模組時,您可能會奇怪為什麼開發人員將其稱為“ Pandas”-非常可愛! 實際上,它來自“面板資料”。

Python實現固定效應迴歸模型實現因果關係推斷

假設我們可以在OLS中詳盡詳盡地指定所有因素

:如果我們想知道一個人的婚姻狀況是否會增加一個人的收入。 假設我們可以指定一個詳盡的模型,明確列出影響收入水平的所有因素:

Python實現固定效應迴歸模型實現因果關係推斷

其中yit是時間t中i的收入,xit是婚姻狀況,Zit都是觀察到的隨時間變化的變數,例如年齡或工作數量。 Wi都是觀察到的不隨時間變化變數,例如種族,_it是誤差項。 如果我們可以列出所有因素,則可以得到的無偏差估計。

在面板資料上執行OLS時,它也稱為“池化OLS”。 當每個觀察值彼此獨立時,這是沒問題的,雖然這不太可能,因為面板資料中同一個人的觀察是相關的。 話雖如此,有時觀察結果在面板內的相關性很小,可以忽略不計。 然後,您可以這樣做。

但是,我們不太可能在OLS中指定所有可能的因素

:很可能我們無法詳盡列出所有OLS的因素。 假設我們從上面的方程式中省略了Zit和Wi,而僅將yit迴歸到xit上。 我們知道婚姻狀況(xit),年齡(Zit)和種族(Wi)很可能相關。 在沒有明確指定Zit和Wi的情況下,OLS中的估計幾乎可以肯定是有偏差的。 這是因為未在方程式中指定Zit和Wi使得它們變得不可觀察併合併到誤差項it中。 這使得婚姻狀況(x_it)是內生的(請參見上面的說明)。 所以結果,無論是正數還是負數,都將毫無意義。 因此,遺漏變數的問題是一個非常嚴重的問題。 如果省略了任何已知變數,則OLS中的結果都是不可靠的。

固定效果模型

Python實現固定效應迴歸模型實現因果關係推斷

上面的_i變數稱為固定效果,因為它不會隨時間變化。 它捕獲了個人的所有不隨時間變化的因素,例如性別,種族甚至個人特質。 yit和xit是i的收入和婚姻狀況,Zit代表i的所有其他隨時間變化的因素。 假定誤差it與所有上述因素都不相關(如果違反了此假設,則將面臨省略變數導致的偏差)。

如何估算方程式(3)? 在幾乎所有教科書中,您都可以看到像方程式(3)一樣的基本表述形式。 可以將其視為i = 0,1。當有多個個體i = 1,…N時,_i可以視為具有各自係數i的一組(N-1)個虛擬變數Di的簡寫,如圖所示。 等式(4)是您在迴歸輸出中看到的。

Python實現固定效應迴歸模型實現因果關係推斷

DiD是FE模型的特例

DiD是FE模型的特例。

Python實現固定效應迴歸模型實現因果關係推斷

DiD背後的想法很簡單。 首先,我們計算在“Before”期間兩組之間的結果均值之差,即圖(E)中的“ A”。 其次,我們在“After”期間計算相同的值,即“ B”。 然後我們取“第二差異”,即“A”和“ B”之間的差異,並標記為“ C”。 第二差異衡量兩組結果的變化如何不同。 差異歸因於干預的因果效應。

以面板資料形式,可以透過“differencing out”混淆因素從有限元模型中得出DiD。 因為沒有混淆因素,所以影響確實是因果關係。 典型設定類似於公式(5)。

Python實現固定效應迴歸模型實現因果關係推斷

假設個體i在治療組(xi = 1)或對照組(xi = 0)中,並且在治療前(ti = 1)或治療後(ti = 0)。 後期的效應為_2,如圖(E)所示。 這是透過以下方式得出的:

Python實現固定效應迴歸模型實現因果關係推斷

DiD模型和FE模型之間的區別在於更改是外生的。 更改是在個人i的選擇之外進行的。 例如,某州更改了其最低飲酒年齡法律。 此政策是外生的。

固定效應資料分析示例1 —投資與市場價值

公司投資的主要驅動力是什麼? 有大量的文獻討論了其驅動因素。 Grunfeld認為,公司的市場價值是投資的主要解釋和預測指標。 在以下練習中,我將使用Grunfeld資料集(可在statsmodels。datasets中獲得)來演示固定效果模型的使用。 順便說一句,Grunfeld資料集是計量經濟學中的知名資料集,就像Machine Learning中的虹膜資料集一樣。 這篇學術文章“ 50歲時的Grunfeld資料”指出了它的廣泛用途。

該資料包含11家公司中每家20年的資料:IBM,通用電氣,美國鋼鐵,大西洋煉油,鑽石比賽,西屋電氣,通用汽車,固特異,克萊斯勒,聯合石油和美國鋼鐵。 在面板資料中,將“確定”和“年份”設定為索引。 固定效果模型指定如下,其中單個公司因子為_i或在以下程式碼中稱為`entity_effects。 時間因子是_t或稱為time_effects。

Python實現固定效應迴歸模型實現因果關係推斷

或如下所示,其中Dj是公司i的虛擬變數,而It是t年的虛擬變數。

Python實現固定效應迴歸模型實現因果關係推斷

from statsmodels。datasets import grunfeld

data = grunfeld。load_pandas()。data

data = data。set_index([“firm”,“year”])

print(data。head())

Python實現固定效應迴歸模型實現因果關係推斷

模組linearmodels提供PandelOLS進行固定效果模型。 entity_effects=True表示模擬企業特定因素。 這意味著為11家公司建立10(N-1)個虛擬變數。 下面我展示了兩種迴歸方法的程式碼。 兩者產生相同的結果。

# Coding method 1

from linearmodels。panel import PanelOLS

import statsmodels。api as sm

exog = sm。add_constant(gf[[‘value’,‘capital’]])

grunfeld_fe = PanelOLS(gf[‘invest’], exog, entity_effects=True, time_effects=False)

grunfeld_fe = grunfeld_fe。fit()

print(grunfeld_fe)

# Coding method 2

grunfeld_fe = PanelOLS。from_formula(“invest ~ value + capital + EntityEffects”, data=gf)

print(grunfeld_fe。fit())

Python實現固定效應迴歸模型實現因果關係推斷

“value”的係數在95%時具有統計學意義上的0。1101。 因此,Grunfeld得出了因果關係,即高投資是由高市場價值驅動的。

下面的程式碼同時指定了公司特有的效果和時間效果。 結論保持不變。

# Coding method 1

from linearmodels。panel import PanelOLS

import statsmodels。api as sm

exog = sm。add_constant(gf[[‘value’,‘capital’]])

grunfeld_fet = PanelOLS(gf[‘invest’], exog, entity_effects=True, time_effects=True)

grunfeld_fet = grunfeld_fe。fit()

print(grunfeld_fet)

# Coding method 2

grunfeld_fet = PanelOLS。from_formula(“invest ~ value + capital + EntityEffects + TimeEffects”, data=gf)

print(grunfeld_fet。fit())

Python實現固定效應迴歸模型實現因果關係推斷

固定收益資料分析示例2 –交通死亡率與啤酒稅

更高的啤酒稅是否有助於減少交通致死率? 許多州降低了啤酒稅,交通事故死亡率更高。 我們可以說降低啤酒稅會導致更高的死亡率嗎? 這種因果關係具有深遠的政策含義。 我將使用Stock&Watson廣為接受的書籍“計量經濟學概論”中的死亡資料集。

import pandas as pd

import numpy as np

import seaborn as sns

fatalities = pd。read_csv(‘/fatality。csv’)

fatalities。head()

Python實現固定效應迴歸模型實現因果關係推斷

mrall = 車輛總死亡率

beertax = 酒精稅

mlda = 最低法定飲酒年齡

jaild = 強制性入獄

comserd = 強制性社群服務

vmiles = 每位駕駛員的平均里程

unrate = 失業率

perinc = 人均個人收入

我將每年的資料生成平均值,以顯示每年的平均啤酒稅和死亡率。 1982–1984年的平均啤酒稅高於1986–1988年的啤酒稅。

avg = fatalities。groupby(‘year’)[‘mrall’,‘beertax’]。mean()

avg

Python實現固定效應迴歸模型實現因果關係推斷

我將使用`seaborn來顯示相關性。

sns。set(style=“darkgrid”)

g = sns。jointplot(“beertax”, “mrall”,

data=avg, kind=“reg”,

color=“m”, height=6)

Python實現固定效應迴歸模型實現因果關係推斷

我們可以建立任何因果關係嗎? 我將使用固定效果模型進行測試。 下面,我演示了兩個固定效果模型並用於討論和彙總OLS。

模型 1: 實體效果+時間效果

模型 2: Entity_effects

模型 3: 彙總OLS

Python實現固定效應迴歸模型實現因果關係推斷

或如下所示,其中Dj是狀態i的虛擬變數,而It是狀態t的虛擬變數。

Python實現固定效應迴歸模型實現因果關係推斷

下面對州的不隨時間變化的變數(例如州文化,州居民對飲酒的態度(可能是不隨時間進行變化)等)進行控制。對所有州隨時間變化的遺漏變數的時效控制。 例如,宏觀經濟條件或聯邦政策措施在所有州都是通用的,但會隨時間而變化。

您可能會詢問如何確認需要固定效果的模型規範。 這是透過

可合併性測試

Poolability Test

)完成的。 許多模組已經包含測試結果。 用於F-test for poolability並顯示輸出。 這是對沒有固定效果的原假設的檢驗。 模型1中的F-test是40。158,p值是0。0,因此我們可以拒絕原假設,並得出固定效果模型規格合適的結論。

模型1:實體效果+時間效果

# Coding method 1

from linearmodels。panel import PanelOLS

import statsmodels。api as sm

exog = sm。add_constant(fatalities[[‘beertax’,‘mlda’,‘jaild’,

‘comserd’,‘vmiles’,‘unrate’,‘perinc’]])

fe = PanelOLS(fatalities[‘mrall’], exog, entity_effects=True, time_effects=True)

fe = fe。fit()

print(fe)

# Coding method 2

from linearmodels。panel import PanelOLS

fe = PanelOLS。from_formula(“mrall ~ beertax + mlda + jaild

+ comserd + vmiles + unrate + perinc + EntityEffects + TimeEffects”,

data=fatalities)

print(fe。fit())

模型1告訴我們,啤酒稅與死亡率之間存在負相關關係(啤酒稅係數為-。4649)。 因此,我們可以得出因果關係,即較高的啤酒稅會導致較低的死亡率。

Python實現固定效應迴歸模型實現因果關係推斷

模型2:Entity_effects

如何理解三個模型中的R-squared值? 模型1中的R-squared為0。3577,高於模型2中的R-squared0。1286。這意味著模型1的擬合效果更好。 模型3中的0。4662怎麼樣? 儘管它比模型1和2的模型高得多,但是合併的OLS是一個錯誤指定的模型,如上面的公式(1)和(2)所述。 由於模型3無法解決內生性問題,因此它無法幫助我們得出啤酒稅和死亡率之間的因果關係。

# Coding method 1

from linearmodels。panel import PanelOLS

import statsmodels。api as sm

exog = sm。add_constant(fatalities[[‘beertax’,‘mlda’,

‘jaild’,‘comserd’,‘vmiles’,‘unrate’,‘perinc’]])

fe2 = PanelOLS(fatalities[‘mrall’], exog,

entity_effects=True, time_effects=False)

fe2 = fe2。fit()

print(fe2)

# Coding method 2

from linearmodels。panel import PanelOLS

fe2 = PanelOLS。from_formula(“mrall ~ beertax + mlda +

jaild + comserd + vmiles + unrate + perinc + EntityEffects”,

data=fatalities)

print(fe2。fit())

Python實現固定效應迴歸模型實現因果關係推斷

模型3:彙總OLS

# Coding method 1

from linearmodels。panel import PanelOLS

import statsmodels。api as sm

exog = sm。add_constant(fatalities[[‘beertax’,‘mlda’,

‘jaild’,‘comserd’,‘vmiles’,‘unrate’,‘perinc’]])

pooledOLS = PanelOLS(fatalities[‘mrall’], exog,

entity_effects=False, time_effects=False)

pooledOLS = pooledOLS。fit()

print(pooledOLS)

# Coding method 2

from linearmodels。panel import PanelOLS

pooledOLS = PanelOLS。from_formula(“mrall ~ beertax +

mlda + jaild + comserd + vmiles + unrate + perinc ”,

data=fatalities)

print(pooledOLS。fit())

Python實現固定效應迴歸模型實現因果關係推斷

作者:Dr。 Dataman

deephub翻譯組:孟翔傑

想了解更多精彩內容,快來關注deephub