Python a également un package appelé PythonMeta qui effectue une méta-analyse, mais cette fois je vais essayer de mettre en œuvre une méta-analyse avec des pandas dans le but d'étudier. J'ai fait.
Il existe deux principaux types de modèles de méta-analyse, ** Modèle à effets fixes ** et ** Modèle à effets aléatoires **, alors implémentons chacun d'eux.
Cette fois, je vais expérimenter en utilisant les données suivantes.
import pandas as pd
import numpy as np
data = pd.DataFrame({
"g": [0.12, 0.23, 0.34, 0.45, 0.42, 0.39, 0.49, 0.65, 0.76, 0.87],
"V": [0.01, 0.04, 0.03, 0.02, 0.01, 0.02, 0.03, 0.04, 0.02, 0.01]
})
Ici, g est Hedges'g (= montant de l'effet) et V est la dispersion du montant de l'effet.
Dans le modèle à effet fixe, le poids de l'élément est simplement l'inverse de la distribution du montant de l'effet. Par conséquent, le montant d'effet moyen à calculer est calculé comme le montant d'effet de chaque élément pondéré et divisé par le poids total. La formule de calcul est la suivante. Même en Python, il peut être écrit en 3 lignes.
#Modèle à effet fixe
data['W'] = 1 / data.V
data['Wg'] = data['g'] * data['W']
result = data['Wg'].sum() / data['W'].sum()
result
>> 0.4776
La partie calcul du poids est un peu compliquée dans le modèle à effets variables. Afin de tenir compte de la variation du montant de l'effet entre les études, une fois que le montant de l'effet est moyenné, l'écart de chaque élément par rapport à celui-ci est incorporé dans le calcul du poids. La formule de calcul est la suivante.
g_hat = data.g.mean()
Q = (data.W * (data.g - g_hat)**2).sum()
data['W2'] = data.W ** 2
C = data.W.sum() - (data.W2.sum()/data.W.sum())
d = len(data) - 1
#Dispersion inter-études
if (Q-d) > 0:
V_between = (Q - d) / C
else:
V_between = 0
data['V_str'] = data.V + V_between
data['W_str'] = 1 / data.V_str
result = (data.g * data.W_str).sum() / data.W_str.sum()
result
Les modèles à effets fixes et à effets variables peuvent calculer un intervalle de confiance de 95% à partir de la somme des poids calculés.
std_err = np.sqrt(1/data.W_str.sum())
lwr = result - 1.96 * std_err
upr = result + 1.96 * std_err
[lwr, upr]
["Introduction to Meta-Analysis for Systematic Review of Psychology / Educational Research" édité par Takeshi Yamada et Toshiya Inoue](https://www.amazon.co.jp/%E3%83%A1%E3%82%BF% E5% 88% 86% E6% 9E% 90% E5% 85% A5% E9% 96% 80-% E5% BF% 83% E7% 90% 86% E3% 83% BB% E6% 95% 99% E8 % 82% B2% E7% A0% 94% E7% A9% B6% E3% 81% AE% E7% B3% BB% E7% B5% B1% E7% 9A% 84% E3% 83% AC% E3% 83 % 93% E3% 83% A5% E3% 83% BC% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AB-% E5% B1% B1% E7% 94% B0-% E5% 89% 9B% E5% 8F% B2 / dp / 4130420720)
Recommended Posts