web-dev-qa-db-fra.com

intervalles de confiance et de prévision avec StatsModels

Je fais ce linear regression avec StatsModels:

import numpy as np
import statsmodels.api as sm
from statsmodels.sandbox.regression.predstd import wls_prediction_std

n = 100

x = np.linspace(0, 10, n)
e = np.random.normal(size=n)
y = 1 + 0.5*x + 2*e
X = sm.add_constant(x)

re = sm.OLS(y, X).fit()
print(re.summary())

prstd, iv_l, iv_u = wls_prediction_std(re)

Mes questions sont, iv_l et iv_u sont les limites supérieure et inférieure intervalles de confiance ou intervalles de prévision

Comment puis-je obtenir les autres? 

J'ai besoin des intervalles de confiance et de prédiction pour tous les points, pour faire un complot.

26
F.N.B

update voir la deuxième réponse qui est plus récente. Certains modèles et classes de résultats ont maintenant une méthode get_prediction qui fournit des informations supplémentaires, notamment des intervalles de prédiction et/ou des intervalles de confiance pour la moyenne prédite.

ancienne réponse:

iv_l et iv_u vous donnent les limites de l'intervalle de prédiction pour chaque point.

L'intervalle de prévision est l'intervalle de confiance d'une observation et inclut l'estimation de l'erreur.

Je pense que l'intervalle de confiance pour la prédiction moyenne n'est pas encore disponible dans statsmodels. (En fait, l'intervalle de confiance pour les valeurs ajustées se cache dans la summary_table of influence_outlier, mais je dois le vérifier.)

Les méthodes de prédiction appropriées pour les modèles de statistiques figurent dans la liste TODO.

Une addition

Les intervalles de confiance sont là pour OLS mais l'accès est un peu maladroit. 

Pour être inclus après avoir exécuté votre script:

from statsmodels.stats.outliers_influence import summary_table

st, data, ss2 = summary_table(re, alpha=0.05)

fittedvalues = data[:, 2]
predict_mean_se  = data[:, 3]
predict_mean_ci_low, predict_mean_ci_upp = data[:, 4:6].T
predict_ci_low, predict_ci_upp = data[:, 6:8].T

# Check we got the right things
print np.max(np.abs(re.fittedvalues - fittedvalues))
print np.max(np.abs(iv_l - predict_ci_low))
print np.max(np.abs(iv_u - predict_ci_upp))

plt.plot(x, y, 'o')
plt.plot(x, fittedvalues, '-', lw=2)
plt.plot(x, predict_ci_low, 'r--', lw=2)
plt.plot(x, predict_ci_upp, 'r--', lw=2)
plt.plot(x, predict_mean_ci_low, 'r--', lw=2)
plt.plot(x, predict_mean_ci_upp, 'r--', lw=2)
plt.show()

enter image description here

Cela devrait donner les mêmes résultats que SAS, http://jpktd.blogspot.ca/2012/01/Nice-thing-about-seeing-zeros.html

28
Josef

Pour les données de test, vous pouvez utiliser les éléments suivants. 

predictions = result.get_prediction(out_of_sample_df)
predictions.summary_frame(alpha=0.05)

J'ai trouvé la méthode summary_frame () enterrée ici et vous pouvez trouver la méthode get_prediction () ici . Vous pouvez modifier le niveau de signification de l'intervalle de confiance et de l'intervalle de prédiction en modifiant le paramètre "alpha". 

Je poste ceci ici parce que c’était le premier billet qui apparaissait lorsqu’on cherchait une solution pour les intervalles de confiance et de prévision, même s’il s’agissait plutôt de données de test.

Voici une fonction permettant de prendre un modèle, de nouvelles données et un quantile arbitraire, en utilisant cette approche:

def ols_quantile(m, X, q):
  # m: OLS model.
  # X: X matrix.
  # q: Quantile.
  #
  # Set alpha based on q.
  a = q * 2
  if q > 0.5:
    a = 2 * (1 - q)
  predictions = m.get_prediction(X)
  frame = predictions.summary_frame(alpha=a)
  if q > 0.5:
    return frame.obs_ci_upper
  return frame.obs_ci_lower
16
Julius

Vous pouvez obtenir les intervalles de prédiction en utilisant la classe LRPI () du cahier Ipython dans mon référentiel ( https://github.com/shahejokarian/regression-prediction-interval ).

Vous devez définir la valeur t pour obtenir l'intervalle de confiance souhaité pour les valeurs de prédiction, sinon la valeur par défaut est 95% conf. intervalle.

La classe LRPI utilise les bibliothèques LinearRegression, numpy et pandas de sklearn.linear_model.

Il y a aussi un exemple dans le cahier.

1
Shahe Jokarian

summary_frame et summary_table fonctionnent bien lorsque vous avez besoin de résultats exacts pour un quantile unique, mais ne vectorisez pas bien. Cela fournira une approximation normale de l'intervalle de prédiction (et non un intervalle de confiance) et fonctionnera pour un vecteur de quantiles:

def ols_quantile(m, X, q):
  # m: Statsmodels OLS model.
  # X: X matrix of data to predict.
  # q: Quantile.
  #
  from scipy.stats import norm
  mean_pred = m.predict(X)
  se = np.sqrt(m.scale)
  return mean_pred + norm.ppf(q) * se
1
Max Ghenis

Vous pouvez les calculer en fonction des résultats donnés par statsmodel et des hypothèses de normalité.

Voici un exemple pour OLS et CI pour la valeur moyenne:

import statsmodels.api as sm
import numpy as np
from scipy import stats

#Significance level:
sl = 0.05
#Evaluate mean value at a required point x0. Here, at the point (0.0,2.0) for N_model=2:
x0 = np.asarray([1.0, 0.0, 2.0])# If you have no constant in your model, remove the first 1.0. For more dimensions, add the desired values.

#Get an OLS model based on output y and the prepared vector X (as in your notation):
model = sm.OLS(endog = y, exog = X )
results = model.fit()
#Get two-tailed t-values:
(t_minus, t_plus) = stats.t.interval(alpha = (1.0 - sl), df =  len(results.resid) - len(x0) )
y_value_at_x0 = np.dot(results.params, x0)
lower_bound = y_value_at_x0 + t_minus*np.sqrt(results.mse_resid*( np.dot(np.dot(x0.T,results.normalized_cov_params),x0) ))
upper_bound = y_value_at_x0 +  t_plus*np.sqrt(results.mse_resid*( np.dot(np.dot(x0.T,results.normalized_cov_params),x0) ))

Vous pouvez envelopper une fonction de Nice autour de cela avec les résultats d'entrée, le point x0 et le niveau de signification sl.

Je ne sais pas si vous pouvez utiliser cela pour WLS () car il se passe des choses supplémentaires là-bas.

Réf.: Ch3 in [D.C. Montgomery et E.A. Picorer. “Introduction à l'analyse de régression linéaire.” 4e. Ed., Wiley, 1992].

0
fabrica