我试图编写一个python函数来计算数据集的学生化残差。我试图遵循传统的等式:
R_student(i)= e(i)/(std(i)* sqrt(1-hi))
其中e(i)表示第i个数据的残差,std(i)表示没有第i个观测值的标准差的估计值,h(i)是矩阵中的第i个对角线元素ħ
X =
| 1 x1 |
| 1 x2 |
| 1 x3 |
| ....... |
| 1 xn |
H = X *(X ^ T * X)^ - 1 * X ^ T,
其中X ^ T是矩阵X的转置
但结果完全错了。我不知道自己做错了什么。我有以下输入/输出数据:
data = [26658,29216,30035,30846,29171,21068,28416,25651,22122, 26423,22467,23274]
我知道答案必须是[-1.3053,0.1031,0.6535,1.2399,0.7552,-2.6869,0.9257,0.0968,-1.0527,0.8846,0.4535,0.1101]
到目前为止我写过的代码:
z = np.ones((len(data), 2))
z[:,1] = data
H = np.dot(np.dot(z, inv(np.dot(z.T, z))), z.T)
deviations = [data[np.arange(len(data))!=i].std() for i in range(len(data))]
et = np.dot(data, H)
S = (deviations * np.sqrt(1 - np.diagonal(H)))
rst = (data-data.mean()) / S
rst = np.array(rst)
答案 0 :(得分:0)
表达式:
data-data.mean()
不是残差in this context的正确定义。从矩阵H
开始,您拟合了y=b0 + b1*x
形式的线性模型。残差的正确含义是:
y - y_hat
其中y
是来自数据和
y_hat = np.dot(H,y)
是拟合值。