如何在Python中计算学生化残差?

时间:2017-08-03 13:07:35

标签: python statistics

我试过寻找这个问题的答案,但到目前为止我还没找到。我使用statsmodel在平均估算数据集上实现普通最小二乘回归模型。我可以访问OLS结果中的残差列表,但不能访问学生化的残差。如何计算/获得学生化残差?我知道计算学生化残差的公式,但我不确定如何在Python中编写这个公式。

提前致谢。

更新:我找到了答案。我可以从OLS结果中获取包含来自outlier_test()函数的学生化残差的数据框。

4 个答案:

答案 0 :(得分:2)

我正在处理同一问题。解决方案是使用statsmodels库:

from statsmodels.stats.outliers_influence import OLSInfluence

它包含一个resid_studentized_internal方法。

答案 1 :(得分:0)

对于简单的线性回归,您可以使用以下

计算学生化残差

将X和Y的平均值定义为:

mean_X = sum(X) / len(X) 
mean_Y = sum(Y) / len(Y) 

现在你必须估算系数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

现在您需要使用此

查找拟合值
y_hat = [beta0 + beta1*X[i] for i in range(len(X))]

现在计算残差,即Y - Y_hat

residuals = [Y[i] - y_hat[i] for i in range(len(Y))]

如果回归为

,则查找标准错误
Var_e = sum([(Y[i] - y_hat[i])**2 for i in range(len(Y)) ]) / (len(Y) -2)
SE_regression = Var_e**0.5

现在您可以计算学生化残差

studentized_residuals = [residuals[i]/SE_regression for i in range(len(residuals))] 

请注意,我们有两种类型的学生化残差。一个是内部学生残留,第二个是外部学生残留

我的解决方案找到了内部学生化的残留物。

答案 2 :(得分:0)

Nodar的实现不正确,这里是https://newonlinecourses.science.psu.edu/stat501/node/339/中的更正公式,以及在人们不想使用statsmodels包的情况下删除的学生化残差。这两个公式都返回与上面的链接中的示例相同的结果

def internally_studentized_residual(X,Y):
    X = np.array(X, dtype=float)
    Y = np.array(Y, dtype=float)
    mean_X = np.mean(X)
    mean_Y = np.mean(Y)
    n = len(X)
    diff_mean_sqr = np.dot((X - mean_X), (X - mean_X))
    beta1 = np.dot((X - mean_X), (Y - mean_Y)) / diff_mean_sqr
    beta0 = mean_Y - beta1 * mean_X
    y_hat = beta0 + beta1 * X
    residuals = Y - y_hat
    h_ii = (X - mean_X) ** 2 / diff_mean_sqr + (1 / n)
    Var_e = math.sqrt(sum((Y - y_hat) ** 2)/(n-2))
    SE_regression = Var_e*((1-h_ii) ** 0.5)
    studentized_residuals = residuals/SE_regression
    return studentized_residuals

def deleted_studentized_residual(X,Y):
    #formula from https://newonlinecourses.science.psu.edu/stat501/node/401/
    r = internally_studentized_residual(X,Y)
    n = len(r)
    return [r_i*math.sqrt((n-2-1)/(n-2-r_i**2)) for r_i in r]

答案 3 :(得分:0)

使用OLSRresults.outlier_test()函数生成一个数据集,其中包含每个观测值的学生化残差。

例如:

#import necessary packages and functions
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols

#create dataset
df = pd.DataFrame({'rating': [90, 85, 82, 88, 94, 90, 76, 75, 87, 86],
                   'points': [25, 20, 14, 16, 27, 20, 12, 15, 14, 19]})

#fit simple linear regression model
model = ols('rating ~ points', data=df).fit()

#calculate studentized residuals
stud_res = model.outlier_test()

#display studentized residuals
print(stud_res)

student_resid    unadj_p     bonf(p)
0   -0.486471   0.641494    1.000000
1   -0.491937   0.637814    1.000000
2    0.172006   0.868300    1.000000
3    1.287711   0.238781    1.000000
4    0.106923   0.917850    1.000000
5    0.748842   0.478355    1.000000
6   -0.968124   0.365234    1.000000
7   -2.409911   0.046780    0.467801
8    1.688046   0.135258    1.000000
9   -0.014163   0.989095    1.000000

本教程提供了完整的解释:https://www.statology.org/studentized-residuals-in-python/