Ich habe versucht, Kapitel 6-10 [Demonstration] am Ende des Kapitels von Messökonomie mit Python zu lösen. Ich weiß nicht viel über Python, bitte weisen Sie auf Verbesserungen hin.
Die Paneldatenanalyse kann mithilfe der linearen Modellbibliothek problemlos durchgeführt werden. Führen Sie zunächst die Konvertierung fester Effekte selbst mit Pandas ohne lineare Modelle durch und schätzen Sie den OLS. Danach wird es mit linearen Modellen verarbeitet.
#Bibliothek zur Basisdatenanalyse
import pandas as pd
import numpy as np
from scipy import stats
#Diagrammzeichnung
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set()
#Statistisches Modell
from statsmodels.formula.api import ols
import statsmodels.api as stm
#Für Paneldaten
from linearmodels.panel.data import PanelData
from linearmodels.panel import PanelOLS, PooledOLS
#Daten lesen
df_1 = pd.read_stata('yamaguchi.dta')
df_1 #Bestätigung der Daten
Bei der Wiedergabe von Tabelle 6-5 des Lehrbuchs werden die nicht verwendeten erklärenden Variablen [nucrate], [numhh] und [hhtype] gelöscht. Im Lehrbuch wurde es nur aus den Daten nach 2000 geschätzt, aber da es eine große Sache ist, werden wir auch die Daten aus den Jahren 1990 und 1995 verwenden.
df_1 = df_1.drop(['nucrate','numhh','hhtype'],axis=1)
df_1 #Datenrahmen anzeigen
Es versteht sich von selbst, dass Kapitel 6 ein Kapitel zur Paneldatenanalyse ist, aber auf den ersten Blick scheint es, dass Beobachtungswerte zu mehreren Zeitpunkten (Jahren) für mehrere Beobachtungsziele (Präferenz) erhalten werden. Ich möchte bestätigen, wie viele Objekte beobachtet werden sollen und wann die Beobachtungszeit ist. Die eindeutige Funktion und die eindeutige Funktion geben eine Liste der eindeutigen Werte bzw. die Anzahl der eindeutigen Werte zurück. Verwenden Sie diese Option.
#Überprüfen Sie die Anzahl der Beobachtungsziele
df_1['pref'].nunique()
#47
#Bestätigen Sie die Beobachtungszeit
df_1['year'].unique()
#array([1990, 1995, 2000, 2005, 2010], dtype=int16)
Es kann bestätigt werden, dass die Beobachtungsziele 47 Präfekturen sind, während die beobachteten Werte von 1990 bis 2010 alle 5 Jahre erhalten werden.
Der Vorteil von Paneldaten besteht darin, dass durch die Umwandlung fester Effekte über die Zeit konstante Variablen für jedes Beobachtungsziel eliminiert und das Auftreten einer fehlenden variablen Verzerrung vermieden werden kann. Alternativ ist es durch Durchführen einer Zeiteffektkonvertierung möglich, Variablen zu eliminieren, die bei Beobachtungszielen üblich sind, sich jedoch im Laufe der Zeit ändern. Das war der Punkt. In dieser Analyse konnte berücksichtigt werden, dass die Unfähigkeit, kulturelle Unterschiede zwischen Präfekturen zu beobachten, die Ursache für die fehlende variable Verzerrung ist, wenn die Regressionsanalyse so wie sie ist durchgeführt wird. Es ist unwahrscheinlich, dass sich kulturelle Unterschiede im Laufe der Zeit erheblich ändern. Daher scheint es möglich zu sein, fehlende variable Verzerrungen durch die Verwendung von Transformationen mit festen Effekten zu vermeiden.
Für Transformationen mit festen Effekten bedeutet $ \ bar {Y} _ {i} = \ frac {1} {T} \ sum ^ {T} \ _ {t = 1} Y \ _ {i über die Zeit der beobachteten Werte Da t} $ erforderlich ist, werden die beobachteten Werte für jede Präfektur von der groupby-Funktion zusammengefasst.
#Berechnen Sie den Durchschnitt der Zeit für jedes Beobachtungsziel
df_1_mean = df_1.groupby('pref').mean()
#Datenrahmen kombinieren
df_1_merged = df_1.merge(df_1_mean,
on = 'pref',
suffixes = ('_origin','_mean'))
Jetzt haben Sie alle Teile, um den festen Effekt umzuwandeln.
#Effektkonvertierung für Variablen behoben
df_1_fet = df_1_merged - df_1_merged.shift(periods = -6,axis=1)
#NaN löschen
df_1_fet = df_1_fet.dropna(axis=1)
df_1_fet
Sie müssen lediglich eine OLS-Schätzung vornehmen und erhalten die zweite Spalte in Tabelle 6-5.
#OLS-Schätzung
result = ols(formula = 'emprate_origin ~ -1 + caprate_origin ',
data = df_1_fet).fit()
#Ergebnisse anzeigen
result.summary().tables[1]
coef | stderr | t | P>t | [0.025 0.975] | |
---|---|---|---|---|---|
caprate | 0.5760 | 0.057 | 10.093 | 0.000 | 0.464 |
Obwohl es sich aufgrund der Auswirkungen der Daten von 1990 und 1995 und des Rundungsfehlers geringfügig vom Lehrbuchwert unterscheidet, handelt es sich um einen geschätzten Wert, der der zweiten Spalte in Tabelle 6-5 entspricht.
Bis zu diesem Punkt habe ich es geschafft, den festen Effekt selbst zu konvertieren und in eine Form zu bringen, mit der OLS geschätzt werden kann. Wenn Sie jedoch das PanelOLS-Modul der Bibliothek für lineare Modelle verwenden, können Sie den festen Effekt und den Zeiteffekt in einer Zeile für Paneldaten schätzen. Ich kann es schaffen Es ist bequem.
Konvertieren Sie zunächst den Datenrahmen in Paneldaten. Geben Sie zu diesem Zeitpunkt einen hierarchischen Index an und verwenden Sie die PanelData-Funktion von linearen Modellen.
#Geben Sie einen hierarchischen Index an
df_1_panel = df_1.set_index(['pref','year'])
#In Paneldaten konvertieren
df_1_panel = PanelData(df_1_panel)
Jetzt können Sie Tabelle 6-5 reproduzieren.
Fügen Sie in der Argumentformel von from_formula des PanelOLS-Moduls die folgenden Elemente entsprechend dem Zweck hinzu. ・ Fester Effekt → Entitätseffekte ・ Zeiteffekte → Zeiteffekte ・ Konstante Laufzeit → 1
#Tabelle 6-5 1. Reihe
result_1 = PanelOLS.from_formula(formula = 'emprate ~ 1 + caprate',
data = df_1_panel).fit(cov_type='clustered',cluster_entity=True,cluster_time=True)
#Tabelle 6-5 2. Reihe
result_2 = PanelOLS.from_formula(formula = 'emprate ~ caprate + EntityEffects',
data = df_1_panel).fit(cov_type='clustered',cluster_entity=True,cluster_time=True)
#Tabelle 6-5 3. Reihe
result_3 = PanelOLS.from_formula(formula = 'emprate ~ caprate + TimeEffects',
data = df_1_panel).fit(cov_type='clustered',cluster_entity=True,cluster_time=True)
#Tabelle 6-5 4. Reihe
result_4 = PanelOLS.from_formula(formula = 'emprate ~ caprate + EntityEffects + TimeEffects',
data = df_1_panel).fit(cov_type='clustered',cluster_entity=True,cluster_time=True)
#Tabelle 6-5 5. Reihe
result_5 = PanelOLS.from_formula(formula = 'emprate ~ caprate + age + agehus + empratehus + urate + TimeEffects',
data = df_1_panel).fit(cov_type='clustered',cluster_entity=True,cluster_time=True)
#Tabelle 6-5 6. Reihe
result_6 = PanelOLS.from_formula(formula = 'emprate ~ caprate + age + agehus + empratehus + urate + EntityEffects +TimeEffects',
data = df_1_panel).fit(cov_type='clustered',cluster_entity=True,cluster_time=True)
Nehmen wir an, wir bestätigen Tabelle 6-5, indem wir das Ergebnis bestätigen.
result_1.summary.tables[1]
result_2.summary.tables[1]
#Ich erhalte die gleiche Schätzung wie damals, als ich mein Bestes getan habe, um den festen Effekt ohne PanelOLS zu konvertieren.
result_3.summary.tables[1]
result_4.summary.tables[1]
result_5.summary.tables[1]
result_6.summary.tables[1]
Die LSDV-Schätzung ist eine Methode, die die gleiche wie die Festeffektschätzung und die Zeiteffektschätzung durch Ändern der Berechnungsmethode durch Zuweisen von Dummy-Variablen für jedes Beobachtungsziel und jeden Beobachtungszeitpunkt ausführt. Verwenden Sie die C () - Funktion von statmodels oder get_dummies () von Pandas, um dem Beobachtungsziel eine Dummy-Variable zuzuweisen.
#Tabelle 6-Führen Sie die 6. 5er-Spalte mit LSDV durch
result_lsdv = ols(formula = 'emprate ~ -1 + C(pref) + C(year) + caprate + age + agehus + empratehus + urate',
data = df_1).fit(cov_type='HC3',use_t=True)
#Ergebnisse anzeigen
pd.DataFrame(result_lsdv.summary().tables[1],
columns = ['','coef','stderr','t','P>|t|','[0.025','0.975]']).iloc[52:,:]
coef | stderr | t | P>t | [0.025 0.975] | |
---|---|---|---|---|---|
caprate | -0.0783 | 0.132 | -0.593 | 0.553 | -0.338 |
age | 0.1735 | 0.013 | -13.443 | 0.000 | -0.199 |
ages | 0.2213 | 0.009 | 25.187 | 0.000 | 0.204 |
empratehus | 1.3598 | 0.194 | 7.001 | 0.000 | 0.978 |
urate | -0.8024 | 0.584 | -1.375 | 0.170 | -1.948 |
Verglichen mit der mit PanelOLS geschätzten 6. Spalte in Tabelle 6-5 sind die Schätzungen genau gleich. Es kann bestätigt werden, dass die LSDV-Schätzung, der feste Effekt und die Zeitschätzung dasselbe bewirken.
Diesmal ist die Standardabweichung keine Standardabweichung, die für die Clusterstruktur robust ist, sondern eine Standardabweichung, die nur für eine ungleichmäßige Dispersion robust ist. Ich habe den Eindruck, dass der absolute Wert von t hoch bewertet wird. Nur dieses Mal gibt es keine Parameter, die den Vorteil ändern, aber in einigen Fällen hat die Standardabweichung, die für die Clusterstruktur robust ist, keinen signifikanten Unterschied gemacht. Es ist möglich, dass Standardabweichungen, die nur gegenüber heterogenen Dispersionen robust sind, signifikant sein können.
Die zweite Spalte in Tabelle 6-5 enthält eine Tabelle für Umrechnungsschätzungen mit festem Effekt. Hier wird der Entscheidungskoeffizient zu diesem Zeitpunkt mit dem Entscheidungskoeffizienten verglichen, wenn eine LSDV-Schätzung durchgeführt wird.
#LSDV-Schätzung
result_2lsdv = ols(formula = ' emprate ~ -1 + C(pref) + caprate',
data = df_1).fit(cov_type='HC3',use_t=True)
#Ergebnisse anzeigen
result_2.summary.tables[0]
#Ergebnisse anzeigen
result_2lsdv.summary().tables[0]
R-squared | R-squared(Between) | R-squared(Within) | R-squared(Overall) |
---|---|---|---|
0.1264 | 0.6823 | 0.1264 | 0.6674 |
Es werden drei Arten von Bestimmungskoeffizienten angezeigt. Wie wichtig es ist, zu bestätigen, auf welcher Definition der Entscheidungsfaktor basiert, wurde auch im Lehrbuch erwähnt. Wenn X der Vektor der erklärenden Variablen und y der Wert der nicht erklärenden Variablen ist, lauten die Definitionen wie folgt. ・ Zwischen → Entscheidungskoeffizient, wenn der Durchschnitt von y auf den Durchschnitt von X zurückgesetzt wird ・ Innerhalb → Entscheidungskoeffizient im Modell mit fester Effektumwandlung ・ Gesamt → Bestimmen des Koeffizienten, wenn y an X zurückgegeben wird
R-squared |
---|
0.650 |
Der Bestimmungskoeffizient (innerhalb) bei der Durchführung einer Umwandlung mit festem Effekt beträgt 0,1264, und der Bestimmungskoeffizient bei der Durchführung der LSDV-Schätzung beträgt 0,650. Sie sehen, dass die Entscheidungsfaktoren sehr unterschiedlich sind.
#LSDV-Schätzung
result_4lsdv = ols(formula = 'emprate ~ -1 + C(year) + caprate',
data = df_1).fit(cov_type='HC3',use_t=True)
#Ergebnisse anzeigen
result_4.summary.tables[0]
#Ergebnisse anzeigen
result_4lsdv.summary().tables[0]
R-squared | R-squared(Between) | R-squared(Within) | R-squared(Overall) |
---|---|---|---|
4.874e-05 | 0.0423 | 0.0118 | 0.0415 |
R-squared |
---|
0.317 |
Der Entscheidungskoeffizient bei der Durchführung der Zeiteffektumwandlung ist (innerhalb) in der obigen Tabelle, also 0,0118, und der Entscheidungskoeffizient bei der Durchführung der LSDV-Schätzung beträgt 0,317. Auch diesmal sind die Entscheidungsfaktoren sicherlich sehr unterschiedlich.
Bei der Vorbereitung dieser Antwort habe ich auf die folgenden Materialien Bezug genommen.
Yoshihiko Nishiyama, Mototsugu Shintani, Daiji Kawaguchi, Ryo Okui "Messökonomie", Yukaku, 2019
Recommended Posts