import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
def check(data):
# 提取数据的第一列和第二列
x = data[:, 0]
y = data[:, 1]
# 使用statsmodels进行线性回归分析
model = sm.OLS(y, sm.add_constant(x)).fit() # 添加常数项
print(model.summary())
print(model.outlier_test()) # 输出已知数据的野值检验
print('残差的方差', model.mse_resid)
# 获取预测结果
predictions = model.get_prediction(data).summary_frame(alpha=0.05)
lower, upper = predictions.conf_int[1].T # 置信下限上限
error_bars = (upper - lower) / 2 # 置信半径
num = np.arange(1, len(x) + 1)
plt.errorbar(num, model.resid, error_bars, fmt='o')
plt.show()
加载数据,确保路径正确
data_path = r'C:\Users\fangz\Desktop\python course\练习题目\第10章\data10_1.txt'
a = np.loadtxt(data_path)
plt.rc('font', size=15) # 设置字体大小
plt.plot(a[:, 0], a[:, 1], 'o') # 绘制原始数据点
plt.figure() # 创建新图形
check(a) # 执行回归分析
删除第9列数据
a2 = np.delete(a, 8, axis=1)
check(a2)
删除第5列数据
a3 = np.delete(a, 4, axis=1)
check(a3)
print("学号后两位:08")
结果如下图所示: