clc
clear
close all
% Исходные данные, вариант 13
X = [13 13.5 14 14.5 15 15.5 16 16.5 ...
17 17.5 18 18.5 19 19.5 20 20.5 21];
Y = [-54.06 -55.20 -68.68 -57.39 -62.38 ...
-61.11 -62.22 -65.21 -71.11 -75.04 ...
-79.74 -78.14 -78.07 -84.54 -86.53 ...
-86.62 -88.36];
% Линейная регрессия, степень 1
XR = [X'.^0 X'];
[b, bint, r, rint] = regress(Y', XR);
% Коэффициенты
b1 = b(2); % при X
b0 = b(1); % свободный член
% Коэффициент детерминации
Ycalc = XR*b;
R2 = 1 - sum((Y' - Ycalc).^2) / ...
sum((Y' - mean(Y')).^2);
% График исходных данных и регрессии
figure(1)
xf = linspace(min(X), max(X), 100);
plot(X, Y, 'bo', xf, b0 + b1*xf, 'r-')
grid on
xlabel('X')
ylabel('Y')
title('Линейная регрессия, вариант 13')
legend('Точки', 'Прямая')
% График остатков и доверительных интервалов
figure(2)
rcoplot(r, rint)
% Определение выбросов
out = (rint(:,1) > 0) | (rint(:,2) < 0);
% Удаление выбросов
X2 = X(~out);
Y2 = Y(~out);
% Линейная регрессия после удаления выбросов
XR2 = [X2'.^0 X2'];
[b2, bint2, r2, rint2] = regress(Y2', XR2);
% Новые коэффициенты
b21 = b2(2); % при X
b20 = b2(1); % свободный член
% Новый коэффициент детерминации
Ycalc2 = XR2*b2;
R2new = 1 - sum((Y2' - Ycalc2).^2) / ...
sum((Y2' - mean(Y2')).^2);
% График после удаления выбросов
figure(3)
xf2 = linspace(min(X2), max(X2), 100);
plot(X2, Y2, 'bo', xf2, b20 + b21*xf2, 'r-')
grid on
xlabel('X')
ylabel('Y')
title('Линейная регрессия без выбросов')
legend('Точки без выбросов', 'Прямая')
% Вывод результатов
disp('Исходная модель:')
disp(['Y = ', num2str(b0), ' + (', num2str(b1), ')*X'])
disp(['R^2 = ', num2str(R2)])
disp('Модель после удаления выбросов:')
disp(['Y = ', num2str(b20), ' + (', num2str(b21), ')*X'])
disp(['R^2 = ', num2str(R2new)])
% Сохранение очищенных данных в Excel
data = [X2(:) Y2(:)];
writematrix(data, 'variant13_clean.xlsx')