我试过寻找这个问题的答案,但到目前为止我还没有找到任何答案。我使用 statsmodel 在均值插补数据集上实现了普通最小二乘回归模型。我可以访问 OLS 结果中的残差列表,但不能访问学生化残差。如何计算/获得学生化残差?我知道计算学生残差的公式,但我不确定如何在 Python 中编写这个公式。
提前致谢。
更新:我找到了答案。我可以从 OLS reults 的 outlier_test() 函数中获得一个包含学生化残差的数据框。
小智 5
我正在处理同样的问题。解决方案是使用statsmodels库:
from statsmodels.stats.outliers_influence import OLSInfluence
Run Code Online (Sandbox Code Playgroud)
它包含一个resid_studentized_internal方法。
对于简单的线性回归,您可以使用以下方法计算学生化残差
将 X 和 Y 的平均值定义为:
mean_X = sum(X) / len(X)
mean_Y = sum(Y) / len(Y)
Run Code Online (Sandbox Code Playgroud)
现在您必须估计系数 beta_0 和 beta_1
beta1 = sum([(X[i] - mean_X)*(Y[i] - mean_Y) for i in range(len(X))]) / sum([(X[i] - mean_X)**2 for i in range(len(X))])
beta0 = mean_Y - beta1 * mean_X
Run Code Online (Sandbox Code Playgroud)
现在您需要使用此找到拟合值
y_hat = [beta0 + beta1*X[i] for i in range(len(X))]
Run Code Online (Sandbox Code Playgroud)
现在计算残差,即 Y - Y_hat
residuals = [Y[i] - y_hat[i] for i in range(len(Y))]
Run Code Online (Sandbox Code Playgroud)
为了找到杠杆,我们必须采用矩阵的对角线元素H,如下所示:
leverage = numpy.diagonal(H)
Run Code Online (Sandbox Code Playgroud)
如果回归为标准误差
Var_e = sum([(Y[i] - y_hat[i])**2 for i in range(len(Y)) ]) / (len(Y) -2)
SE_regression = math.sqrt(Var_e*[(1-leverage[i]) for i in range len(leverage)])
Run Code Online (Sandbox Code Playgroud)
现在您可以计算学生化残差
studentized_residuals = [residuals[i]/SE_regression for i in range(len(residuals))]
Run Code Online (Sandbox Code Playgroud)
请注意,我们有两种类型的学生化残差。一是内部学生化残差,二是外部学生化残差
我的解决方案找到内部学生化残差。
我对我的计算进行了修正。对于外部学生化残差,请参阅@kkawabat的答案