Скачиваний:
1
Добавлен:
12.02.2026
Размер:
8 Кб
Скачать
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