[Kapitel 6] Problem am Ende des Kapitels (Demonstration) der quantitativen Ökonomie (Yukikaku), Antwort von Python

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.

Kapitelende Problem 6-10 (1)


#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.

Mühelose Verarbeitung mit linearen Modellen

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]

Kapitelende Problem 6-10 (2)

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.

Kapitelende Problem 6-10 (3)

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]

Ergebnisse der festen Effektschätzung
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

Ergebnisse der LSDV-Schätzung
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.

Kapitelende Problem 6-10 (4)


#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]
Ergebnisse der Zeiteffektschätzung
R-squared R-squared(Between) R-squared(Within) R-squared(Overall)
4.874e-05 0.0423 0.0118 0.0415
Ergebnisse der LSDV-Schätzung
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.

Verweise

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

Mackinnon and White(1985)"Some Heteroskedasticity Consistent Covariance Matrix Estimators with Improved Finite Sample Properties",Journal of Econometrics, 1985, vol. 29, issue 3, 305-325

statmodels

linearmodels

QuantEcon

Recommended Posts

[Kapitel 6] Problem am Ende des Kapitels (Demonstration) der quantitativen Ökonomie (Yukikaku), Antwort von Python
[Kapitel 8] Ende des Kapitels Problem der metrischen Ökonomie (Yukikaku), Antwort von Python
100 Sprachverarbeitung Knock Kapitel 1 von Python
Python-Lernnotiz für maschinelles Lernen von Chainer bis zum Ende von Kapitel 2
Antwort auf AtCoder Beginners Selection von Python3