102 lines
2.9 KiB
Python
102 lines
2.9 KiB
Python
|
'''Additional functions
|
||
|
|
||
|
prediction standard errors and confidence intervals
|
||
|
|
||
|
|
||
|
A: josef pktd
|
||
|
'''
|
||
|
|
||
|
import numpy as np
|
||
|
from scipy import stats
|
||
|
|
||
|
def atleast_2dcol(x):
|
||
|
''' convert array_like to 2d from 1d or 0d
|
||
|
|
||
|
not tested because not used
|
||
|
'''
|
||
|
x = np.asarray(x)
|
||
|
if (x.ndim == 1):
|
||
|
x = x[:, None]
|
||
|
elif (x.ndim == 0):
|
||
|
x = np.atleast_2d(x)
|
||
|
elif (x.ndim > 0):
|
||
|
raise ValueError('too many dimensions')
|
||
|
return x
|
||
|
|
||
|
|
||
|
def wls_prediction_std(res, exog=None, weights=None, alpha=0.05):
|
||
|
'''calculate standard deviation and confidence interval for prediction
|
||
|
|
||
|
applies to WLS and OLS, not to general GLS,
|
||
|
that is independently but not identically distributed observations
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
res : regression result instance
|
||
|
results of WLS or OLS regression required attributes see notes
|
||
|
exog : array_like (optional)
|
||
|
exogenous variables for points to predict
|
||
|
weights : scalar or array_like (optional)
|
||
|
weights as defined for WLS (inverse of variance of observation)
|
||
|
alpha : float (default: alpha = 0.05)
|
||
|
confidence level for two-sided hypothesis
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
predstd : array_like, 1d
|
||
|
standard error of prediction
|
||
|
same length as rows of exog
|
||
|
interval_l, interval_u : array_like
|
||
|
lower und upper confidence bounds
|
||
|
|
||
|
Notes
|
||
|
-----
|
||
|
The result instance needs to have at least the following
|
||
|
res.model.predict() : predicted values or
|
||
|
res.fittedvalues : values used in estimation
|
||
|
res.cov_params() : covariance matrix of parameter estimates
|
||
|
|
||
|
If exog is 1d, then it is interpreted as one observation,
|
||
|
i.e. a row vector.
|
||
|
|
||
|
testing status: not compared with other packages
|
||
|
|
||
|
References
|
||
|
----------
|
||
|
|
||
|
Greene p.111 for OLS, extended to WLS by analogy
|
||
|
|
||
|
'''
|
||
|
# work around current bug:
|
||
|
# fit does not attach results to model, predict broken
|
||
|
#res.model.results
|
||
|
|
||
|
covb = res.cov_params()
|
||
|
if exog is None:
|
||
|
exog = res.model.exog
|
||
|
predicted = res.fittedvalues
|
||
|
if weights is None:
|
||
|
weights = res.model.weights
|
||
|
else:
|
||
|
exog = np.atleast_2d(exog)
|
||
|
if covb.shape[1] != exog.shape[1]:
|
||
|
raise ValueError('wrong shape of exog')
|
||
|
predicted = res.model.predict(res.params, exog)
|
||
|
if weights is None:
|
||
|
weights = 1.
|
||
|
else:
|
||
|
weights = np.asarray(weights)
|
||
|
if weights.size > 1 and len(weights) != exog.shape[0]:
|
||
|
raise ValueError('weights and exog do not have matching shape')
|
||
|
|
||
|
|
||
|
# full covariance:
|
||
|
#predvar = res3.mse_resid + np.diag(np.dot(X2,np.dot(covb,X2.T)))
|
||
|
# predication variance only
|
||
|
predvar = res.mse_resid/weights + (exog * np.dot(covb, exog.T).T).sum(1)
|
||
|
predstd = np.sqrt(predvar)
|
||
|
tppf = stats.t.isf(alpha/2., res.df_resid)
|
||
|
interval_u = predicted + tppf * predstd
|
||
|
interval_l = predicted - tppf * predstd
|
||
|
return predstd, interval_l, interval_u
|