我试过寻找这个问题的答案,但到目前为止我还没找到。我使用statsmodel在平均估算数据集上实现普通最小二乘回归模型。我可以访问OLS结果中的残差列表,但不能访问学生化的残差。如何计算/获得学生化残差?我知道计算学生化残差的公式,但我不确定如何在Python中编写这个公式。
提前致谢。
更新:我找到了答案。我可以从OLS结果中获取包含来自outlier_test()函数的学生化残差的数据框。
答案 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/