51

私はこれlinear regressionを行い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_liv_u下限の信頼区間または予測区間ですか?

他のユーザーを取得するにはどうすればよいですか?

プロットを行うには、すべてのポイントの信頼区間と予測区間が必要です。

4

6 に答える 6

45

更新は、より最近の2番目の回答を参照してください。一部のモデルと結果クラスにはget_prediction、予測平均の予測区間や信頼区間などの追加情報を提供するメソッドが追加されました。

古い答え:

iv_liv_u各ポイントの予測間隔の制限を示します。

予測区間は観測値の信頼区間であり、誤差の推定値が含まれます。

平均予測の信頼区間はまだ利用できないと思いますstatsmodels。(実際には、適合値の信頼区間はinfluence_outlierのsummary_table内に隠されていますが、これを確認する必要があります。)

統計モデルの適切な予測方法は、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

于 2013-07-10T00:20:48.953 に答える
0

これらは、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() に使用できるかどうかはわかりません。

参照: [DC モンゴメリーと EA ペックの Ch3。「線形回帰分析の紹介」。4番目。編、ワイリー、1992]。

于 2018-10-27T09:17:59.700 に答える