[Chapitre 6] Problème de fin de chapitre (démonstration) de l'économie métrique (Yukikaku), réponse par python

J'ai essayé de résoudre le chapitre 6-10 [Démonstration] à la fin de Measurement Economics avec python. Je ne connais pas grand chose à python, alors veuillez signaler toute amélioration.

L'analyse des données de panneau peut être facilement réalisée en utilisant la bibliothèque de modèles linéaires. Tout d'abord, effectuez la conversion à effet fixe par vous-même en utilisant des pandas sans utiliser de modèles linéaires et estimez l'OLS. Après cela, il est traité à l'aide de modèles linéaires.

Problème de fin de chapitre 6-10 (1)


#Bibliothèque pour l'analyse de données de base
import pandas as pd
import numpy as np
from scipy import stats

#Dessin graphique
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set()

#Modèle statistique
from statsmodels.formula.api import ols
import statsmodels.api as stm 

#Pour les données de panneau
from linearmodels.panel.data import PanelData
from linearmodels.panel import PanelOLS, PooledOLS
#lire les données statistiques
df_1 = pd.read_stata('yamaguchi.dta')

df_1 #Confirmation des données

En reproduisant le tableau 6-5 du manuel, les variables explicatives [nucrate], [numhh] et [hhtype] qui ne sont pas utilisées sont supprimées. Dans le manuel, nous avons estimé uniquement à partir des données après 2000, mais comme c'est un gros problème, nous utilisons également les données de 1990 et 1995.


df_1 = df_1.drop(['nucrate','numhh','hhtype'],axis=1)
df_1  #Afficher le bloc de données

Il va sans dire que le chapitre 6 est un chapitre sur l'analyse des données de panel, mais à première vue sur la base de données, il semble que des valeurs d'observation à plusieurs moments (années) soient obtenues pour plusieurs cibles d'observation (préf). Je voudrais confirmer le nombre d'objets à observer et l'heure d'observation. La fonction unique et la fonction unique renvoient respectivement une liste de valeurs uniques et le nombre de valeurs uniques, alors utilisez ceci.


#Vérifiez le nombre de cibles d'observation
df_1['pref'].nunique() 
#47

#Confirmer l'heure d'observation
df_1['year'].unique() 
#array([1990, 1995, 2000, 2005, 2010], dtype=int16)

On peut confirmer que les cibles d'observation sont 47 préfectures, alors que les valeurs observées sont obtenues tous les 5 ans de 1990 à 2010.

L'avantage des données de panel est que la conversion à effet fixe peut éliminer les variables constantes au fil du temps pour chaque cible d'observation et éviter l'apparition d'un biais de variable manquant. Alternativement, en effectuant une conversion d'effet de temps, il est possible d'éliminer les variables qui sont communes parmi les cibles d'observation mais changent avec le temps. C'était le point. Dans cette analyse, il a été possible de considérer que l'incapacité à observer les différences culturelles entre les préfectures est la cause du biais de variable manquant lors de la réalisation de l'analyse de régression telle quelle. Il est peu probable que les différences culturelles changent de manière significative au fil du temps, il semble donc possible d'éviter de manquer un biais variable en utilisant des transformations à effets fixes.

Pour les transformations à effet fixe, cela signifie $ \ bar {Y} _ {i} = \ frac {1} {T} \ sum ^ {T} \ _ {t = 1} Y \ _ {i, sur la durée des valeurs observées Puisque t} $ est requis, les valeurs observées sont résumées pour chaque préfecture par la fonction groupby.

#Calculez le temps moyen pour chaque cible d'observation
df_1_mean = df_1.groupby('pref').mean()

#Combiner des trames de données
df_1_merged = df_1.merge(df_1_mean,
                         on = 'pref',
                         suffixes = ('_origin','_mean'))

Vous avez maintenant toutes les parties pour convertir l'effet fixe.

#Conversion à effet fixe pour les variables
df_1_fet = df_1_merged - df_1_merged.shift(periods = -6,axis=1)

#Effacer NaN
df_1_fet = df_1_fet.dropna(axis=1)
df_1_fet

Tout ce que vous avez à faire est de faire une estimation MCO et vous obtiendrez la deuxième colonne du tableau 6-5.

#Estimation OLS
result = ols(formula = 'emprate_origin ~  -1 + caprate_origin ',
            data = df_1_fet).fit()
#Voir les résultats
result.summary().tables[1]
coef stderr t P>t [0.025 0.975]
caprate 0.5760 0.057 10.093 0.000 0.464

Bien qu'elle soit légèrement différente de la valeur des manuels en raison de l'influence des données de 1990 et 1995 et de l'erreur d'arrondi, il s'agit d'une valeur estimée correspondant à la deuxième colonne du tableau 6-5.

Traitez sans effort avec des modèles linéaires

Jusqu'à présent, j'ai réussi à convertir l'effet fixe par moi-même et je l'ai amené sous une forme permettant d'estimer l'OLS, mais si vous utilisez le module PanelOLS de la bibliothèque de modèles linéaires, vous pouvez estimer l'effet fixe et l'effet temporel sur une ligne pour les données de panneau. Je peux le faire. C'est pratique.

Commencez par convertir le bloc de données en données de panneau. À ce moment-là, donnez un index hiérarchique et utilisez la fonction PanelData des modèles linéaires.

#Donner un index hiérarchique
df_1_panel = df_1.set_index(['pref','year'])

#Convertir en données de panneau
df_1_panel = PanelData(df_1_panel)

Vous êtes maintenant prêt à reproduire le tableau 6-5.

Dans l'argument formule de from_formula du module PanelOLS, ajoutez les éléments suivants en fonction de l'objectif. ・ Effet fixe → Effets d'entité ・ Effets temporels → Effets temporels ・ Terme constant → 1

#Tableau 6-5 1ère rangée
result_1 = PanelOLS.from_formula(formula = 'emprate ~ 1 + caprate',
                                 data = df_1_panel).fit(cov_type='clustered',cluster_entity=True,cluster_time=True)

#Tableau 6-5 2e rangée
result_2 = PanelOLS.from_formula(formula = 'emprate ~ caprate + EntityEffects', 
                                 data = df_1_panel).fit(cov_type='clustered',cluster_entity=True,cluster_time=True)

#Tableau 6-5 3e rangée
result_3 = PanelOLS.from_formula(formula = 'emprate ~ caprate + TimeEffects', 
                                 data = df_1_panel).fit(cov_type='clustered',cluster_entity=True,cluster_time=True)

#Tableau 6-5 4e rangée
result_4 = PanelOLS.from_formula(formula = 'emprate ~ caprate + EntityEffects + TimeEffects', 
                                 data = df_1_panel).fit(cov_type='clustered',cluster_entity=True,cluster_time=True)

#Tableau 6-5 5ème rangée
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)

#Tableau 6-5 6ème rangée
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)

Disons qu'en confirmant le résultat, nous reproduirons le tableau 6-5.

result_1.summary.tables[1]
result_2.summary.tables[1] 
 #J'obtiens la même estimation que lorsque j'ai fait de mon mieux pour convertir l'effet fixe sans utiliser PanelOLS.
result_3.summary.tables[1]
result_4.summary.tables[1]
result_5.summary.tables[1]
result_6.summary.tables[1]

Problème de fin de chapitre 6-10 (2)

L'estimation LSDV est une méthode qui fonctionne de la même manière que l'estimation à effet fixe et l'estimation à effet temporel en modifiant la méthode de calcul en attribuant des variables fictives pour chaque cible d'observation et point de temps d'observation. Pour affecter une variable factice à la cible d'observation, utilisez la fonction C () de statmodels ou get_dummies () de pandas.

#Tableau 6-Effectuer la 6ème colonne de 5 avec LSDV
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)

#Voir les résultats
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

Par rapport à la 6ème colonne du tableau 6-5 estimée à l'aide de PanelOLS, les estimations sont exactement les mêmes. On peut confirmer que l'estimation LSDV, l'effet fixe et l'estimation du temps font la même chose.

Cette fois, l'écart-type n'est pas un écart-type robuste à la structure du cluster, mais un écart-type qui n'est robuste qu'à une dispersion non uniforme. J'ai l'impression que la valeur absolue de t est hautement évaluée. Seulement cette fois, il n'y a pas de paramètres qui modifient l'avantage, mais dans certains cas, l'écart type qui est robuste à la structure du cluster n'a pas fait de différence significative. Il est possible que les écarts types qui ne sont robustes qu'aux dispersions hétérogènes puissent être significatifs.

Problème de fin de chapitre 6-10 (3)

La deuxième colonne du tableau 6-5 est un tableau pour les estimations de conversion à effet fixe. Ici, le coefficient de décision à ce moment est comparé au coefficient de décision lorsque l'estimation LSDV est effectuée.

#Estimation LSDV
result_2lsdv = ols(formula = ' emprate ~ -1 + C(pref) + caprate',
                   data = df_1).fit(cov_type='HC3',use_t=True)

#Voir les résultats
result_2.summary.tables[0]

#Voir les résultats
result_2lsdv.summary().tables[0]

Résultats de l'estimation à effet fixe
R-squared R-squared(Between) R-squared(Within) R-squared(Overall)
0.1264 0.6823 0.1264 0.6674

Trois types de coefficients de détermination sont affichés. L'importance de confirmer sur quelle définition le facteur de décision est basé a également été mentionnée dans le manuel. Si X est le vecteur de la variable explicative et y est la valeur de la variable non explicative, les définitions sont les suivantes. ・ Entre → Coefficient de décision lorsque la moyenne de y est ramenée à la moyenne de X ・ Dans → Coefficient de décision dans le modèle avec conversion à effet fixe ・ Global → Détermination du coefficient lorsque y est renvoyé à X

Résultats de l'estimation LSDV
R-squared
0.650

Le coefficient de détermination (intérieur) lors de la conversion à effet fixe est de 0,1264 et le coefficient de détermination lors de l'estimation de LSDV est de 0,650. Vous pouvez voir que les facteurs de décision sont très différents.

Problème de fin de chapitre 6-10 (4)


#Estimation LSDV
result_4lsdv = ols(formula = 'emprate ~ -1 + C(year) + caprate',
                   data = df_1).fit(cov_type='HC3',use_t=True)

#Voir les résultats
result_4.summary.tables[0]

#Voir les résultats
result_4lsdv.summary().tables[0]
Résultats de l'estimation de l'effet temps
R-squared R-squared(Between) R-squared(Within) R-squared(Overall)
4.874e-05 0.0423 0.0118 0.0415
Résultats de l'estimation LSDV
R-squared
0.317

Le coefficient de décision lorsque la conversion d'effet de temps est effectuée est (Dans) dans le tableau ci-dessus, donc 0,0118, et le coefficient de décision lorsque l'estimation LSDV est effectuée est de 0,317. Cette fois aussi, les facteurs de décision sont certainement très différents.

Les références

En préparant cette réponse, je me suis référé aux matériaux suivants.

Yoshihiko Nishiyama, Mototsugu Shintani, Daiji Kawaguchi, Ryo Okui "Measurement Economics", 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

[Chapitre 6] Problème de fin de chapitre (démonstration) de l'économie métrique (Yukikaku), réponse par python
[Chapitre 8] Problème de fin de chapitre de l'économie métrique (Yukikaku), réponse de python
100 Language Processing Knock Chapitre 1 par Python
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer jusqu'à la fin du chapitre 2
Réponse à la sélection des débutants d'AtCoder par Python3