Скачиваний:
0
Добавлен:
12.02.2026
Размер:
8.01 Кб
Скачать
close all;
% П1. Загружаем данные
A = table2array(readtable("A_10.csv"));
Ax = A(:,1);
Ay = A(:,2);
B = table2array(readtable("B_10.csv"));
Bx = B(:,1);
By = B(:,2);
% Рассчитываем длину вектора
n_A = length(Ax);
n_B = length(Bx);
% П2. Рассчитываем параметры прямых
[A0,A1] = ols_coeff(Ax,Ay);
[B0,B1] = ols_coeff(Bx,By);
% П4. Рассчитываем параметры
[eA, RSS_A, SST_A, R2_A] = RSS_R2(Ax,Ay,A0,A1);
[eB, RSS_B, SST_B, R2_B] = RSS_R2(Bx,By,B0,B1);
% П2-5. Строим графики
% Окно Графиков и гистограм
figure("Name","A and B plots and histograms")
% График сета А
subplot(2,2,1)
% Выводим точки на график
scatter(Ax,Ay, 12, "black","filled","o");
hold on;
grid on;
% Выводим прямую
plot(Ax, A0+A1*Ax, "Color", "#002395");
hold on;
% Рассчитываем где должен быть текст
x_min = min(Ax); x_max = max(Ax); y_min = min(Ay); y_max = max(Ay);
txt_x = x_min + (x_max-x_min)*0.5; txt_y = y_min + (y_max-y_min)*0.2;
% Выводим текст
text(txt_x, txt_y, ["R^2 = " + num2str(R2_A, 4), "RSS = " + ...
num2str(RSS_A, 6), "SST = " + num2str(SST_A, 4)])
hold on;
legend("Original dataset", "Regression")
xlabel("X")
ylabel("Y")
title("Dataset A")
% График сета Б
subplot(2,2,2)
% Аналогичные действия
scatter(Bx,By, 12, "black","filled","o");
hold on;
grid on;
plot(Bx, B0+B1*Bx, "Color", "magenta");
hold on;
x_min = min(Bx); x_max = max(Bx); y_min = min(By); y_max = max(By);
txt_x = x_min + (x_max-x_min)*0.1; txt_y = y_min + (y_max-y_min)*0.1;
text(txt_x, txt_y*15, ["R^2 = " + num2str(R2_B, 4), "RSS = " + ...
num2str(RSS_B, 8), "SST = " + num2str(SST_B, 4)])
hold on;
legend("Original dataset", "Regression")
xlabel("X")
ylabel("Y")
title("Dataset B")

% Вывод гистограмм
% Для массива А
subplot(2,2,3)
histogram(eA, "Normalization","count", "FaceColor","#002395");
xlabel("e")
ylabel("%")
title("Error Histogram A")
grid on;
% Для массива Б
subplot(2,2,4)
histogram(eB, "Normalization","count", "FaceColor","magenta");
xlabel("e")
ylabel("%")
title("Error Histogram B")
grid on;
% Окно скатерограмм
figure("Name","A and B scaterograms")
% Вывод скатерограмм
% Ошибка от значения для А
subplot(2,2,1)
scatter(Ax, eA, 12, "blue","filled","o");
xlabel("x")
ylabel("e")
title("Error Scaterogram A")
grid on;
% Ошибка от значения для Б
subplot(2,2,2)
scatter(Bx, eB, 12, "magenta","filled","o");
xlabel("x")
ylabel("e")
title("Error Scaterogram B")
grid on;
% Дисперсия ошибки от значения для А
subplot(2,2,3)
scatter(Ax, eA.*eA, 12, "blue", "filled","o");
xlabel("x")
ylabel("var(y`)")
title("Variance Scaterogram A")
grid on;
% Дисперсия ошибки от значения для Б
subplot(2,2,4)
scatter(Bx, eB.*eB, 12, "magenta","filled","o");
xlabel("x")
ylabel("var(y`)")
title("Variance Scaterogram B")
grid on;
% П6. Рассчёты статистик
% Тесты ранговой корреляции Спирмена
[rho_A, p_value_r_A] = corr(Ay, A0+A1*Ax, 'Type', 'Spearman');
[rho_B, p_value_r_B] = corr(By, B0+B1*Bx, 'Type', 'Spearman');
% Тесты Голдфелда-Квандта
[F_A, F_A_table] = g_q_test(Ax,Ay);
[F_B, F_B_table] = g_q_test(Bx,By);
% Вывод в консоль для удобного копирования
disp("For dataset A, r = " + num2str(rho_A));
if (p_value_r_A < 0.05)
disp("p-value < a: p-value = " + p_value_r_A);
else
disp("p-value > a: p-value = " + p_value_r_A);
end
if (F_A < F_A_table)
disp("F < F_table: F = " + F_A + ", F_table = " + F_A_table);
else
disp("F > F_table: F = " + F_A + ", F_table = " + F_A_table);
end

disp(" ");

disp("For dataset B, r = " + num2str(rho_B));
if (p_value_r_B < 0.05)
disp("p-value < a: p-value = " + p_value_r_B);
else
disp("p-value > a: p-value = " + p_value_r_B);
end
if (F_B < F_B_table)
disp("F < F_table: F = " + F_B + ", F_table = " + F_B_table);
else
disp("F > F_table: F = " + F_B + ", F_table = " + F_B_table);
end

% П2. Рассчёт коэффициентов по МНК
function [b0, b1] = ols_coeff(x, y)
% Валидация входных данных
arguments
x (1, :) double
y (1, :) double
end
% Валидация равенства размеров массивов
if ~isequal(size(x),size(y))
eid = 'Size:notEqual';
msg = 'Size of first input must equal size of second input.';
error(eid,msg)
end
% Перемножаем попарно Х на У
for i = 1:length(x)
xy(i) = x(i)*y(i);
end
% Рассчитываем коэффициенты
b1 = (mean(xy)-mean(x)*mean(y))/(mean(x.^2)-mean(x)^2);
b0 = mean(y)-b1*mean(x);
end

% П4. Характеристики массивов.
function [e, RSS, SST, R2] = RSS_R2(x,y,b0,b1)
% Валидация входных данных
arguments
x (:, 1) double
y (:, 1) double
b0 (1, 1) double
b1 (1, 1) double
end
% проверка рафвенства измерений
if ~isequal(size(x),size(y))
eid = 'Size:notEqual';
msg = 'Size of first input must equal size of second input.';
error(eid,msg)
end
% Рассчёт значений рег. прямой
y_reg = b0 + b1*x;
% Рассчёт массива остатков
e = y - y_reg;
% Рассчёт остаточной суммы квадратов
RSS = sum(e.^2);
% Рассчёт общей дисперсии
SST = sum((y-mean(y)).^2);
% Рассчёт коэффициента детерминации
R2 = 1-(RSS/SST);
end
% П6. Тест Голдфелда-Квандта.
function [F, F_table] = g_q_test(x,y)
% Валидация входных аргументов
arguments
x (:, 1) double
y (:, 1) double
end
% Проверка равенства измерений
if ~isequal(size(y), size(x))
eid = 'Size:notEqual';
msg = 'Size of first input must equal size of second input.';
error(eid,msg)
end
% Таблица [y, y прямой, остатки]
table = [x, y];
% Сортировка по возрастанию x
table = sortrows(table, 1);
% Рассчёт количества строк
n = length(x);
% Рассчёт количества выкидываемых элементов
C = round(n*0.33/2);
% Верхняя граница нижних значений
n1 = round((n/2)-C);
% Нижняя граница верхних значений
n2 = round((n/2)+C);
% Массив нижних зачений
T1 = table(1:n1, :);
% Массив верхних зачений
T2 = table(n2:n, :);
% Пустой массив коэффициентов регрессии
b = [0,0;0,0];
% Рассчёт коэффициентов
[b(1,1),b(1,2)]= ols_coeff(T1(:,1),T1(:,2));
[b(2,1),b(2,2)]= ols_coeff(T2(:,1),T2(:,2));
% Построение линий регрессии
T1(:,3) = b(1,1)+b(1,2)*T1(:,1);
T2(:,3) = b(2,1)+b(2,2)*T2(:,1);
% Рассчёт остатков
T1(:,4) = T1(:,2)-T1(:,3);
T2(:,4) = T2(:,2)-T2(:,3);
% Рассчёт остаточной суммы квадратов
S1 = sum(T1(:,4).^2);
S2 = sum(T2(:,4).^2);
% Рассчёт статистики
F = S2/S1;
% Рассчёт табличного значения
F_table = finv(0.95, n1-2, n-n2-2);
end
Соседние файлы в папке 2