私はこれをします linear regression
with 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)
私の質問は、iv_l
およびiv_u
は上限と下限です信頼区間または予測区間?
他の人をどうやって手に入れますか?
プロットを行うには、すべてのポイントの信頼区間と予測区間が必要です。
update最新の2番目の回答を参照してください。一部のモデルと結果クラスには、get_prediction
予測平均および/または予測平均の信頼区間を含む追加情報を提供する方法。
古い答え:
iv_l
およびiv_u
は、各ポイントの予測間隔の制限を示します。
予測区間は、観測値の信頼区間であり、誤差の推定値が含まれます。
平均予測の信頼区間はstatsmodels
でまだ利用できないと思います。 (実際には、近似値の信頼区間は、influence_outlierのsummary_table内に隠れていますが、これを確認する必要があります。)
Statsmodelsの適切な予測方法はTODOリストにあります。
追加
OLSには信頼区間がありますが、アクセスは少し不器用です。
スクリプトの実行後に含めるには:
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()
これにより、SASと同じ結果が得られます。 http://jpktd.blogspot.ca/2012/01/Nice-thing-about-seeing-zeros.html
テストデータの場合、次の使用を試みることができます。
predictions = result.get_prediction(out_of_sample_df)
predictions.summary_frame(alpha=0.05)
Summary_frame()メソッドが埋まっていることがわかりました here そして、get_prediction()メソッド here が見つかりました。 「アルファ」パラメーターを変更することにより、信頼区間と予測区間の有意水準を変更できます。
これは、信頼と予測の間隔のソリューションを探しているときに出てくる最初の投稿だったので、ここで投稿しています。
このアプローチを使用して、モデル、新しいデータ、および任意の変位値を取得する関数を次に示します。
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
リポジトリのIpythonノートブックからLRPI()クラスを使用して、予測間隔を取得できます( https://github.com/shahejokarian/regression-prediction-interval )。
予測値に必要な信頼区間を取得するには、t値を設定する必要があります。設定しない場合、デフォルトは95%confです。間隔。
LRPIクラスはsklearn.linear_modelのLinearRegression、numpyおよびpandasライブラリを使用します。
ノートブックにも例があります。
summary_frame
およびsummary_table
単一の変位値に対して正確な結果が必要な場合はうまく機能しますが、ベクトル化はうまくいきません。これにより、(信頼区間ではなく)予測区間の通常の近似が提供され、分位数のベクトルに対して機能します。
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
Statsmodelで与えられた結果と正規性の仮定に基づいて計算できます。
平均値のOLSとCIの例を次に示します。
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) ))
入力結果、ポイントx0、有意水準slを使用して、これにニース関数をラップできます。
WLS()でこれを使用できるかどうかは、今はわからないことがあります。
参照:[D.C.のCh3モンゴメリーとE.A.ペック。 「線形回帰分析の概要。」4番目。 Ed。、Wiley、1992]。