МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра биотехнических систем
отчет
по лабораторной работе №2
по дисциплине «Моделирование биологических процессов и систем»
Тема: Простая линейная регрессия.
Студенты гр. 2503 |
|
Малышев К.А. |
|
|
Кузнецов Д.А. |
Преподаватель |
|
Палогианнидис Д. |
Санкт-Петербург
2025
Основные теоретические положения
Цель: исследование свойств модели простой линейной регрессии.
Простая ЛР используется для установления зависимости между двумя непрерывными переменными. Одна переменная считается предиктором или независимой переменной, другая – целевой или зависимой переменной.
Формула модели линейной регрессии представлена на рисунке 1:
Рисунок 1 – формула линейной регрессии.
Данная модель может быть применена только в случае, если между переменными существует линейная зависимость. Ошибки регрессии можно представить как «неучтенные факторы», влияющие на Y помимо фактора X. Таким образом, уравнение регрессии отражает представления о характере зависимости между факторами.
Относительно ошибок регрессии будем предполагать выполнения следующих условий, называемых иногда условиями Гаусса – Маркова [1]:
1. E (εi) = 0, i = 1, ... , n – среднее значение ошибки равно нулю, т.е. ошибки регрессии несистематические);
2. var (εi) = σ2 – дисперсия постоянная и не зависит от i;
3. cov (εi, εj) = 0 при i ≠ j - некоррелируемость ошибок для разных наблюдений;
4. εi ∼ N (0, σ2), i = 1, ... , n - нормальная распределенность ошибок регрессии.
Пусть есть выборка, состоящая из пар значений предиктора и целевой переменной, X и Y соответственно. Прирасчет уравнения регрессионной прямой необходимо найти такое положение этой прямой, которое даст наименьшее значение отклонения этой прямой от точек, т.е. минимизировать ошибку. С вероятностной точки зрения, в случае нормального распределения выборочных данных «наилучшими вероятностными и статистическими свойствами» обладают оценки параметров прямой, полученным минимизацией суммы квадратов отклонений. Этот метод получения оценок параметров оптимальной прямой называется Методом Наименьших Квадратов (сокращенно МНК) 2 или Ordinary Least Squares (сокращенно OLS), а полученные оценки параметров называются МНК- или OLS-оценками.
Коэффициенты прямой могут быть определены по формулам:
где
– среднее значение произведений пар
(x, y),
– среднее значение предиктора,
– среднее значение целевой переменной.
Разность между действительным значением и предсказанным называют остатком или отклонением (рис. 2):
Рисунок 2 – Регрессионная прямая.
Можно считать, что остатки в некотором смысле «моделируют» ошибки регрессии и «наследуют» их свойства.
Величина RSS называется остаточной суммой квадратов (residual sum of squares) в модели регрессии. Это и есть суммарная ошибка регрессии.
Коэффициент детерминации 𝑅2 отражает качество модели и определяется через остаточную сумму квадратов и общую дисперсию 𝑆𝑆𝑇, таким образом выражая, какая доля дисперсии целевой переменной может быть объяснена предиктором.
Для получения качественных оценок параметров уравнения регрессии необходимо следить за выполнимостью предпосылок МНК. Применяя МНК мы предполагаем, что остатки εi подчиняются условиям Гаусса-Маркова, данное предположение необходимо проверить, после построения уравнения регрессии.
Отчёт о проделанной работе
В ходе работы была разработана программа, рассчитывающая коэффициенты регрессионной прямой и основные параметры, характерные для выборки, при сравнении с прямой.
С по методу наименьших квадратов были получены коэффициенты для регрессионной прямой для наборов данных A и B. Регрессионные прямые для соответствующих наборов данных, в соответствии с коэффициентами описываются следующими выражениями:
В соответствии с этими наборами данных и уравнений были рассчитаны: остаточная сумма квадратов (RSS), остаточная дисперсия (SST) и коэффициент детерминации R2 для каждого из наборов. Рассчитанные характеристики, а также отображения набора данных и графики регрессионных прямых для наборов A и B показаны на рисунках 3 и 4 соответственно:
Рисунок 3 – Отображение набора А
Рисунок 4 – Отображение набора B
Исходя из полученных данных видно, что линейная регрессионная модель подходит для первого набора данных, так как R2 = 0.691, а значит модель объясняет 69.1% дисперсии данных, но не подходит для второго набора данных, так как R2 = 0.017, а значит модель объясняет лишь 1.7% дисперсии данных.
Проверим для набора для набора данных выполнение некоторых условий Гаусса – Маркова:
Построим гистограммы остатков:
Рисунок 5 – Гистограммы остатков для наборов А и В
Как вино из гистограмм, остатки в первом наборе скорее всего подвержены нормальному распределению, однако ошибки во втором наборе определённо не подвержены нормальному распределению и распределены по какому-то другому закону распределения.
Проведём тестирование связи набора данных с моделью с помощью теста ранговой корреляции Спирмена и сравним p-value с уровнем значимости α = 0.05:
For dataset A, r = 0.79128; p-value < a: p-value = 0
For dataset B, r = 0.088401; p-value > a: p-value = 0.38117
Из выведенных данных понятно, что, в случае с набором А, наблюдается сильная и статистически значимая связь, так как r близко к 1, а p-value значительно меньше α. В случае с набором В, такой связи не наблюдается, r близко к 0, а p-value значительно больше α.
Проведём тест Голдфелда-Квандта для определения гомоскедастичности регрессионной модели:
For dataset A, F < F_table: F = 1.2039, F_table = 1.8221
For dataset B, F < F_table: F = 0.9353, F_table = 1.8221
В обоих случаях модели данных имеют гомоскедастичность, так как полученное значение критерия F меньше табличного для исходных степеней свободы и уровня значимости.
Проверим полученные выводы, построив скаттерограммы остатков и квадратов остатков:
Рисунок 6 – Скаттерограмма остатков для набора А
Рисунок 7 – Скаттерограмма остатков для набора В
Рисунок 8 – Скаттерограмма дисперсий остатков для набора А
Рисунок 9 – Скаттерограмма дисперсий остатков для набора В
Как видно из графиков, для набора данных В видны существенные выбросы на концах оси х, что говорит о наличии гетероскедастичности набора данных, различие с показаниями теста могут быть из-за того, что тест не чувствителен к выбросам, большая часть точек имеет примерно одинаковую ширину дисперсионного облака, а значит могла оцениться тестом как наличие гомоскедастичности.
В любом случае, проведённые измерения показывают, что, для набора данных А, линейная регрессионная модель достоверно является справедливой, а для набора данных В – не является достоверно справедливой.
Вывод
В ходе лабораторной работы была рассмотрена модель линейной регрессии и её свойства.
Для набора A, сильная зависимость видна и статистически подтверждена тестом Спирмена. R2 ~ 0.69, а значит регрессия объясняет большую часть дисперсии y. Тест Голдфелда-Квандта не показывает гетероскедастичности. Визуальная проверка подтверждают линейный характер набора, а значит линейная модель применима для набора A (при обычных допущениях МНК).
Для набора В, R2 близко к нулю и тест Спирмена показывает незначимую ранговую связь, то есть линейной зависимости между x и y практически не обнаружено. Тест Голдфелда-Квандта не показал гетероскедастичности. Визуально видно, что данные либо шумные, либо присутствуют сильные выбросы – то есть структура не линейная. Соответственно, линейная модель не подходит для набора B по результатам количественных тестов и визуального анализа.
Приложение 1 Листинг программы
close all;
% П1. Загружаем данные
A = table2array(readtable("A_13.csv"));
Ax = A(:,1);
Ay = A(:,2);
B = table2array(readtable("B_13.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.1; txt_y = y_min + (y_max-y_min)*0.1;
% Выводим текст
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, ["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
