NumPy¶
import numpy as np
import wooldridge as woo
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import pickle
Regresión Simple¶
Wooldridge 2016, ejemplo-2-3¶
Cargamos las regresiones¶
archi_o = open(r'../Lab8/regsmf.pkl', 'rb')
reg_smf = pickle.load(archi_o)
archi_o.close()
reg_smf.fit().summary()
Dep. Variable: | salary | R-squared: | 0.013 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.008 |
Method: | Least Squares | F-statistic: | 2.767 |
Date: | Fri, 21 May 2021 | Prob (F-statistic): | 0.0978 |
Time: | 07:48:57 | Log-Likelihood: | -1804.5 |
No. Observations: | 209 | AIC: | 3613. |
Df Residuals: | 207 | BIC: | 3620. |
Df Model: | 1 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
Intercept | 963.1913 | 213.240 | 4.517 | 0.000 | 542.790 | 1383.592 |
roe | 18.5012 | 11.123 | 1.663 | 0.098 | -3.428 | 40.431 |
Omnibus: | 311.096 | Durbin-Watson: | 2.105 |
---|---|---|---|
Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 31120.902 |
Skew: | 6.915 | Prob(JB): | 0.00 |
Kurtosis: | 61.158 | Cond. No. | 43.3 |
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Bondad de ajuste¶
Suma Total de Cuadrados
Suma Explicada de Cuadrados
Suma Residual de Cuadrados
Bondad de ajuste
y = reg_smf.endog
x = reg_smf.exog[:,1]
ym = np.mean(y)
yh = reg_smf.fit().fittedvalues
yh.head()
# imprimir tipos de datos
0 1224.058071
1 1164.854261
2 1397.969216
3 1072.348338
4 1218.507712
dtype: float64
yh = reg_smf.fit().predict(exog=dict(roe=x))
yh.head()
0 1224.058071
1 1164.854261
2 1397.969216
3 1072.348338
4 1218.507712
dtype: float64
stc = np.sum(np.power(y-ym,2))
stc
391732982.00956935
sec = np.sum(np.power(yh-ym,2))
sec
5166419.039866708
uh = y - yh # residuales
src = np.sum(uh ** 2)
src
386566562.96970266
stc == sec + src
True
r2 = 1 - src/stc
print("Bondad de ajuste",r2)
Bondad de ajuste 0.01318862408103405
Errores estándar¶
Estimador de la varianza \(\sigma^2\) de los errores \(u_i\)
Error estándar de la regresion (EER, error estandar de la estimación, raí< del error cuadratico medio) es la estimación de la desviación estandar \(\sigma\) de los errores \(u_i\)
Error estándar de \(\hat\beta_0\), es el estimador de la desviación estándar de \(\hat\beta_0\)
Error estándar de \(\hat\beta_1\), es el estimador de la desviación estándar de \(\hat\beta_1\)
n = reg_smf.nobs
varhu = src/(n-2)
varhu
1867471.3186942157
eer = np.sqrt(varhu)
eer
1366.5545428903363
xm = np.mean(x)
stcx = np.sum(np.power(x-xm,2))
scx = np.sum(np.power(x,2))
eeb0 = eer*np.sqrt(scx/(n*stcx))
eeb0
213.24025690501887
eeb1 = eer/np.sqrt(stcx)
eeb1
11.123250903287637
Estadísticos¶
Bajo las condiciones adecuadas se tiene que:
Se pueden plantear las siguientes pruebas de hipótesis
Para cada muestra de datos \((x,y)_m\) se tienen las estimaciones \(\hat\beta_j\) de \(\beta_j\), es por ello que se habla de la distribución de la variable aleatoria indicada.
Para una muestra dada, si aplicamos la hipótesis nula
regresion = reg_smf.fit()
b0=regresion.params[0]
tb0 = b0/eeb0
tb0
4.516930107158806
b1=regresion.params[1]
tb1 = b1/eeb1
tb1
1.66328949208065
Valor \(p\)¶
Para ello necesitamos el submódulo de scipy: stats, en este caso la distribución \(t\) tiene la siguiente descripción
donde \(\nu\) son los grados de libertad, y t.pdf(x, df, loc, scale)
, con la sigeuinte tranformación y = (x - loc) / scale.
from scipy.stats import t
df = 207
rv = t(df)
pb0 = rv.cdf(-tb0) + (1-rv.cdf(tb0)) # argumentos de cdf: loc = 0, scale = 1
pb0
1.0533519915197438e-05
pb1 = rv.cdf(-tb1) + (1-rv.cdf(tb1))
pb1
0.09776774891928593
regresion.pvalues
Intercept 0.000011
roe 0.097768
dtype: float64