Основная цель
концептуально
простого моделирования линейной регрессии — найти лучшую прямую линию на двумерной плоскости, состоящей из пар значений X и Y (т. е. измерений X и Y).После того как линия найдена с использованием метода минимальной дисперсии, можно выполнить различные статистические тесты, чтобы определить, насколько хорошо линия соответствует наблюдаемому отклонению от значения Y.
Линейное уравнение (y = mx + b) имеет два параметра, которые необходимо оценить на основе предоставленных данных X и Y: наклон (m) и точка пересечения y (b). После оценки этих двух параметров вы можете ввести наблюдаемые значения в линейное уравнение и наблюдать прогнозы Y, сгенерированные этим уравнением.
Чтобы оценить параметры m и b с помощью метода минимальной дисперсии, нам необходимо найти расчетные значения m и b, которые минимизируют наблюдаемые и прогнозируемые значения Y для всех значений X. Разница между наблюдаемыми и прогнозируемыми значениями называется ошибкой ( y i- (mx i+ b) ), и если вы возводите в квадрат каждое значение ошибки, а затем суммируете эти остатки, результатом будет предсказанное квадратное число Bad. Использование метода минимальной дисперсии для определения наилучшего соответствия включает в себя поиск оценок m и b, которые минимизируют дисперсию прогноза.
Для нахождения оценок m и b, удовлетворяющих методу минимальной дисперсии, можно использовать два основных метода. В первом подходе можно использовать процесс числового поиска, чтобы установить различные значения m и b и оценить их, в конечном итоге выбрав оценку, которая дает минимальную дисперсию. Второй метод — использовать математический анализ для нахождения уравнений для оценки m и b. Я не собираюсь вдаваться в исчисление, связанное с выводом этих уравнений, но я использовал эти аналитические уравнения в классе SimpleLinearReгрессия, чтобы найти оценки m и b методом наименьших квадратов (см. getSlope() и getYIntercept в методе класса SimpleLinearRegrade).
Даже если у вас есть уравнения, которые можно использовать для нахождения оценок m и b методом наименьших квадратов, это не означает, что если вы подставите эти параметры в линейное уравнение, результатом будет прямая линия, которая хорошо соответствует данным. Следующим шагом в этом простом процессе линейной регрессии является определение приемлемости оставшейся дисперсии прогноза.
Вы можете использовать статистический процесс принятия решений, чтобы отвергнуть альтернативную гипотезу о том, что прямая линия соответствует данным. Этот процесс основан на вычислении Т-статистики с использованием функции вероятности для определения вероятности случайно большого наблюдения. Как упоминалось в части 1, класс SimpleLinearRegrade генерирует ряд сводных значений, одним из важных сводных значений является статистика T, которую можно использовать для измерения того, насколько хорошо линейное уравнение соответствует данным. Если соответствие хорошее, статистика T будет иметь большое значение; если значение T мало, вам следует заменить линейное уравнение моделью по умолчанию, которая предполагает, что среднее значение значений Y является лучшим предиктором ( т.к. среднее значение набора значений часто может быть полезным предиктором следующего наблюдения).
Чтобы проверить, достаточно ли велика статистика T, чтобы не использовать среднее значение Y в качестве лучшего предсказателя, вам необходимо вычислить вероятность случайного получения статистики T. Если вероятность низкая, то можно отказаться от нулевого предположения о том, что среднее значение является лучшим предиктором, и, соответственно, можно быть уверенным, что простая линейная модель хорошо подходит к данным. (Дополнительную информацию о расчете вероятности Т-статистики см. в части 1.)
Вернитесь к процессу принятия статистических решений. Он сообщает вам, когда не следует принимать нулевую гипотезу, но не говорит вам, следует ли принимать альтернативную гипотезу. В условиях исследования альтернативные гипотезы линейной модели должны быть установлены с помощью теоретических и статистических параметров.
Инструмент исследования данных, который вы создадите, реализует статистический процесс принятия решений для линейных моделей (Т-тесты) и предоставляет сводные данные, которые можно использовать для построения теоретических и статистических параметров, необходимых для построения линейных моделей. Инструменты исследования данных можно классифицировать как инструменты поддержки принятия решений, позволяющие работникам умственного труда изучать закономерности в наборах данных малого и среднего размера.
С точки зрения обучения стоит изучить простое моделирование линейной регрессии, поскольку это единственный способ понять более сложные формы статистического моделирования. Например, многие основные концепции простой линейной регрессии создают хорошую основу для понимания множественной регрессии (Множественная регрессия), факторного анализа (Факторный анализ) и временных рядов (Временные ряды).
Простая линейная регрессия также является универсальным методом моделирования. Его можно использовать для моделирования криволинейных данных путем преобразования необработанных данных (обычно с помощью логарифмического или степенного преобразования). Эти преобразования линеаризуют данные, чтобы их можно было моделировать с помощью простой линейной регрессии. Полученная линейная модель будет представлена в виде линейной формулы, связанной с преобразованными значениями.
Функция вероятности.
В предыдущей статье я избежал проблемы реализации функции вероятности в PHP, попросив R найти значение вероятности. Такое решение меня не полностью удовлетворило, поэтому я начал исследовать вопрос: что нужно для разработки вероятностных функций на базе PHP.
Я начал искать в Интернете информацию и код. Одним из источников для обоих является книга «Численные рецепты в C. Функции вероятности». Я переопределил некоторый код функций вероятности (функции gammln.c и betai.c) в PHP, но результаты меня все еще не устраивают. Кажется, в нем немного больше кода, чем в некоторых других реализациях. Кроме того, мне нужна обратная функция вероятности.
К счастью, я наткнулся на «Интерактивные статистические расчеты» Джона Пеццулло. На веб-сайте Джона, посвященном функциям распределения вероятностей, есть все необходимые мне функции, реализованные на JavaScript, чтобы облегчить обучение.
Я портировал функции Student T и Fisher F на PHP. Я немного изменил API, чтобы он соответствовал стилю именования Java, и встроил все функции в класс под названием Distribution. Отличительной особенностью этой реализации является метод doCommonMath, который повторно используется всеми функциями в этой библиотеке. Другие тесты, которые я не удосужился реализовать (тест на нормальность и тест хи-квадрат), также используют метод doCommonMath.
Стоит отметить и еще один аспект этой трансплантации. Используя JavaScript, пользователи могут присваивать динамически определяемые значения переменным экземпляра, например:
вар PiD2 = пи()/2
Вы не можете сделать это в PHP. Переменным экземпляра можно присваивать только простые константные значения. Надеюсь, этот недостаток будет исправлен в PHP5.
Обратите внимание, что код в листинге 1 не определяет переменные экземпляра — это потому, что в версии JavaScript им присваиваются значения динамически.
Листинг 1. Реализация функции вероятности
<?php
// Distribution.php
// Авторские права Джон Пезулло
// Выпущено на тех же условиях, что и PHP.
// PHP-порт и объектно-ориентированная оптимизация Пола Мигера
class Distribution {
function doCommonMath($q, $i, $j, $b) {
$зз = 1;
$z = $zz;
$к = $я;
в то время как ($k <= $j) {
$zz = $zz * $q * $k / ($k - $b);
$z = $z + $zz;
$к = $к + 2;
}
вернуть $z;
}
функция getStudentT($t, $df) {
$t = abs($t);
$w = $t / sqrt($df);
$th = Атан($w);
если ($df == 1) {
вернуть 1 - $th / (pi() / 2);
}
$sth = грех ($th);
$cth = потому что ($th);
if( ($df % 2) ==1 ) {
возвращаться
1 - ($th + $sth * $cth * $this->doCommonMath($cth * $cth, 2, $df - 3, -1))
/ (пи()/2);
} еще {
return 1 - $sth * $this->doCommonMath($cth * $cth, 1, $df - 3, -1);
}
}
функция getInverseStudentT($p, $df) {
$в = 0,5;
$дв = 0,5;
$т = 0;
в то время как ($ dv > 1e-6) {
$t = (1 / $v) - 1;
$дв = $дв/2;
if ( $this->getStudentT($t, $df) > $p) {
$v = $v - $dv;
} еще {
$v = $v + $dv;
}
}
вернуть $т;
}
функция getFisherF($f, $n1, $n2) {
// реализовано, но не показано
}
function getInverseFisherF($p, $n1, $n2) {
// реализовано, но не показано
}
}
?>
Методы вывода
Теперь, когда вы реализовали функцию вероятности в PHP, единственной оставшейся задачей в разработке инструмента исследования данных на основе PHP является разработка метода отображения результатов анализа.
Простое решение — вывести на экран значения всех переменных экземпляра по мере необходимости. В первой статье я именно это и сделал, показывая линейное уравнение, Т-значение и Т-вероятность для исследования выгорания. Полезно иметь доступ к определенным значениям для определенных целей, и SimpleLinearReгрессия поддерживает такое использование.
Однако другой метод вывода результатов — систематическая группировка частей вывода. Если вы изучите выходные данные основных пакетов статистического программного обеспечения, используемых для регрессионного анализа, вы обнаружите, что они имеют тенденцию группировать свои выходные данные одинаковым образом. Они часто включают сводную таблицу, таблицу дисперсионного анализа, таблицу оценки параметров и значение R. Аналогичным образом я создал несколько методов вывода со следующими именами:
showSummaryTable().
показатьАнализВарианса()
showParameterEstimates()
показатьRValues()
У меня также есть метод для отображения формулы линейного предсказания ( getFormula() ). Многие пакеты статистического программного обеспечения не выводят формулы, но ожидают, что пользователь построит формулы на основе результатов вышеупомянутых методов. Частично это связано с тем, что окончательная форма формулы, которую вы в конечном итоге используете для моделирования ваших данных, может отличаться от формулы по умолчанию по следующим причинам:
Y-пересечение может не иметь значимой интерпретации или входные значения могли быть преобразованы. таким образом, что вам может потребоваться отменить их преобразование, чтобы получить окончательное объяснение.
Все эти методы предполагают, что средством вывода является веб-страница. Учитывая, что вы, возможно, захотите вывести эти сводные значения не на веб-странице, я решил обернуть эти методы вывода в класс, наследующий класс SimpleLinearReгрессия. Код в листинге 2 предназначен для демонстрации общей логики выходного класса. Чтобы сделать общую логику более заметной, был удален код, реализующий различные методы показа.
Листинг 2. Демонстрация общей логики выходного класса
<?php
// HTML.php
// Авторские права 2003, Пол Мигер.
// Распространяется под лицензией GPL
include_once "slr/SimpleLinearReprofit.php";
class SimpleLinearReprofitHTML расширяет SimpleLinearReгрессия {
function SimpleLinearReprofitHTML($X, $Y, $conf_int) {
SimpleLinearReгрессия::SimpleLinearReгрессия($X, $Y, $conf_int);
}
функция showTableSummary($x_name, $y_name) { }
function showAnalysisOfVariance() { }
function showParameterEstimates() { }
function showFormula($x_name, $y_name) { }
function showRValues() {}
}
?>
Конструктор этого класса — это просто оболочка конструктора класса SimpleLinearReгрессия. Это означает, что если вы хотите отобразить выходные данные анализа SimpleLinearRegrade в формате HTML, вам следует создать экземпляр класса SimpleLinearReprofitHTML вместо непосредственного создания экземпляра класса SimpleLinearReгрессия. Преимущество состоит в том, что вы не будете загромождать класс SimpleLinearReгрессия множеством неиспользуемых методов и сможете более свободно определять классы для других выходных носителей (возможно, реализуя один и тот же API для разных типов носителей).
Графический вывод.
Методы вывода, которые вы уже реализовали, отображают сводные значения в формате HTML. Он также подходит для отображения точечных диаграмм или линейных графиков этих данных в формате GIF, JPEG или PNG.
Вместо того, чтобы самому писать код для создания графиков линий и распределения, я подумал, что лучше использовать графическую библиотеку на основе PHP под названием JpGraph. JpGraph активно разрабатывается Йоханом Перссоном, чей веб-сайт проекта описывает это следующим образом:
как для графиков, «полученных быстрым, но неподходящим способом» с минимальным кодом, так и для сложных профессиональных графиков, требующих очень детального контроля, JpGraph можно использовать. Рисование им становится легко. JpGraph одинаково подходит для графиков научного и делового типа.
Дистрибутив JpGraph включает в себя ряд примеров сценариев, которые можно настроить под конкретные нужды. Использовать JpGraph в качестве инструмента исследования данных так же просто, как найти образец сценария, который делает что-то похожее на то, что мне нужно, и адаптировать его в соответствии с моими конкретными потребностями.
Сценарий в листинге 3 взят из примера инструмента исследования данных (explore.php) и демонстрирует, как вызвать библиотеку и заполнить классы Line и Scatter данными из анализа SimpleLinearRegrade. Комментарии к этому коду были написаны Йоханом Перссоном (база кода JPGraph хорошо документирует их).
Листинг 3. Подробности функций из примера инструмента исследования данных explore.php
<?php
// Фрагмент, извлеченный из скрипта explore.php
include ("jpgraph/jpgraph.php");
включить ("jpgraph/jpgraph_scatter.php");
include ("jpgraph/jpgraph_line.php");
// Создаем график
$graph = новый график(300,200,'авто');
$graph->SetScale("linlin");
// заголовок настройки
$graph->title->Set("$title");
$graph->img->SetMargin(50,20,20,40);
$graph->xaxis->SetTitle("$x_name","center");
$graph->yaxis->SetTitleMargin(30);
$graph->yaxis->title->Set("$y_name");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// проверяем, что ось X всегда находится справа;
// нижняя часть графика, а не только Y=0, что
// позиция по умолчанию
$graph->xaxis->SetPos('min');
// Создаем точечную диаграмму с красивыми цветами
$sp1 = новый ScatterPlot($slr->Y, $slr->X);
$sp1->mark->SetType(MARK_FILLEDCIRCLE);
$sp1->mark->SetFillColor("красный");
$sp1->SetColor("синий");
$sp1->SetWeight(3);
$sp1->mark->SetWidth(4);
// Создаём линию регрессии
$lplot = новый LinePlot($slr->PredictedY, $slr->X);
$lplot->SetWeight(2);
$lplot->SetColor('navy');
// Добавляем pltos в строку
$граф->Добавить($sp1);
// ... и обводка
);
$graph_name = "temp/test.png";
$graph->Stroke($graph_name);
?>
<img src='<?php echo $graph_name ?>' vspace='15'>
?>
Скрипт исследования данных
Инструмент исследования данных состоит из одного скрипта (explore.php), который вызывает методы класса SimpleLinearReprofitHTML и библиотеки JpGraph. .
Скрипт использует простую логику обработки. Первая часть сценария выполняет базовую проверку отправленных данных формы. Если данные формы проходят проверку, выполняется вторая часть скрипта.
Вторая часть скрипта содержит код, который анализирует данные и отображает сводные результаты в HTML и графическом форматах. Базовая структура сценария explore.php показана в листинге 4:
Листинг 4. Структура explore.php
<?php
// explore.php
if (!empty($x_values)) {
$X = взорваться(",", $x_values);
$numX = счетчик ($X);
}
if (!empty($y_values)) {
$Y = взорваться(",", $y_values);
$numY = количество ($Y);
}
// отображаем форму ввода данных, если переменные не заданы
if ( (empty($title)) OR (empty($x_name)) OR (empty($x_values)) OR
(пусто($y_name)) ИЛИ (пусто($conf_int)) ИЛИ (пусто($y_values)) ИЛИ
($numX != $numY)) {
// Пропущен код для отображения формы ввода
} еще {
include_once "slr/SimpleLinearReprofitHTML.php";
$slr = новый SimpleLinearReprofitHTML($X, $Y, $conf_int);
echo "<h2>$title</h2>";
$slr->showTableSummary($x_name, $y_name);
эхо "<br><br>";
$slr->showAnalysisOfVariance();
echo "<br><br>";
$slr->showParameterEstimates($x_name, $y_name);
echo "<br>";
$slr->showFormula($x_name, $y_name);
echo "<br><br>";
$slr->showRValues($x_name, $y_name);
echo "<br>"
include ("jpgraph/jpgraph.php");
включить ("jpgraph/jpgraph_scatter.php");
включить ("jpgraph/jpgraph_line.php");
// Код для отображения графики встроен в файл
// скрипт explore.php Код для этих двух линейных графиков.
// завершает скрипт:
// Пропущен код для отображения точечного плюс линейного графика
// Пропущен код для отображения графика остатков
}
?>
Исследование ущерба от пожара
Чтобы продемонстрировать, как использовать инструменты исследования данных, я буду использовать данные гипотетического исследования ущерба от пожара. В этом исследовании объем ущерба от пожара в крупных жилых районах связывается с их расстоянием от ближайшего пожарного депо. Например, страховые компании были бы заинтересованы в изучении этой взаимосвязи с целью определения страховых взносов.
Данные для этого исследования показаны на экране ввода на рисунке 1.
Рисунок 1. Экран ввода, показывающий данные исследования.
После отправки данных они анализируются, и отображаются результаты этого анализа. Первый отображаемый набор результатов — это сводная таблица , как показано на рисунке 2.
Рисунок 2. Сводная таблица — это первый отображаемый набор результатов.
В сводной таблице отображаются входные данные в табличной форме и дополнительные столбцы, указывающие прогнозируемое значение Y, соответствующее наблюдаемому значению .
На рис. 3 показаны три сводные таблицы данных высокого уровня, следующие за сводной таблицей.
Рисунок 3. После таблицы «Сводка» показаны три сводные таблицы данных высокого уровня.
В таблице «Анализ дисперсии» показано, как отклонения значений Y можно отнести к двум основным источникам отклонения: дисперсии, объясняемой моделью (см. строку «Модель»), и дисперсии, не объясняемой моделью (см. строку «Ошибка»). Большое значение F означает, что линейная модель фиксирует большую часть отклонений измерений Y. Эта таблица более полезна в среде множественной регрессии, где каждая независимая переменная имеет строку в таблице.
В таблице «Оценки параметров» показаны предполагаемые точки пересечения оси Y (Intercept) и наклон (Slope). Каждая строка содержит значение T и вероятность наблюдения экстремального значения T (см. столбец Prob > T). Prob > T для наклона можно использовать для отклонения линейной модели.
Если вероятность значения T больше 0,05 (или аналогичная малая вероятность), то вы можете отвергнуть нулевую гипотезу, поскольку вероятность случайного наблюдения экстремального значения мала. В противном случае вы должны использовать нулевую гипотезу.
В исследованиях потерь от пожара вероятность случайного получения значения Т размером 12,57 составляет менее 0,00000. Это означает, что линейная модель является полезным предиктором (лучше, чем среднее значение значений Y ) значений Y , которые соответствуют диапазону значений X , наблюдаемому в этом исследовании.
В итоговом отчете показан коэффициент корреляции или значение R. Их можно использовать для оценки того, насколько хорошо линейная модель соответствует данным. Высокое значение R указывает на хорошее согласие.
Каждый сводный отчет содержит ответы на различные аналитические вопросы о взаимосвязи между линейной моделью и данными. Обратитесь к учебнику Гамильтона, Нетера или Педозера, чтобы узнать о более продвинутых методах регрессионного анализа.
Последними элементами отчета, которые будут отображаться, являются график распределения и линейный график данных, как показано на рисунке 4.
Рисунок 4. Элементы итогового отчета: график распределения и линейный график.
Большинство людей знакомы с описанием линейных графиков (таких как первый график в этой серии), поэтому я не буду это комментировать, за исключением того, что библиотека JPGraph может создавать высококачественные научные графики для Интернета. Он также отлично работает при вводе данных о распределении или прямых линиях.
Второй график связывает остатки (наблюдаемый Y , прогнозируемый Y ) с прогнозируемыми значениями Y. Это пример графика, используемого сторонниками исследовательского анализа данных (EDA), чтобы помочь максимизировать способность аналитиков обнаруживать и понимать закономерности в данных. Эксперты могут использовать эту диаграмму, чтобы ответить на вопросы о:
Этот инструмент исследования данных можно легко расширить для создания большего количества типов графиков — гистограммы, блок графики и квартильные графики — это стандартные инструменты EDA.
Архитектура математической библиотеки
Мое увлечение математикой в последние месяцы поддерживало мой интерес к математическим библиотекам. Подобные исследования заставляют меня задуматься о том, как организовать свою кодовую базу и предвидеть будущий рост.
Сейчас я буду использовать структуру каталогов из листинга 5:
Листинг 5. Структура каталогов, которую легко расширить
phpmath/ burnout_study.php explore.php fire_study.php navbar.php расстояние/ Распределение.php fisher.php студент.php источник.php jpграф/ и т. д... зеркалка/ ПростаяЛинейнаяРегрессия.php Простаялинейная регрессияHTML.php температура/ |
В будущем установка переменной PHP_MATH будет осуществляться через файл конфигурации всей математической библиотеки PHP.
Чему вы научились?
В этой статье вы узнали, как использовать класс SimpleLinearReгрессия для разработки инструментов исследования данных для наборов данных малого и среднего размера. Попутно я также разработал собственную функцию вероятности для использования с классом SimpleLinearReprofit и расширил класс методами вывода HTML и кодом генерации графиков на основе библиотеки JpGraph.
С точки зрения обучения простое моделирование линейной регрессии заслуживает дальнейшего изучения, поскольку оно оказалось единственным способом понять более сложные формы статистического моделирования. Вам будет полезно получить четкое представление о простой линейной регрессии, прежде чем углубляться в более сложные методы, такие как множественная регрессия или многомерный дисперсионный анализ.
Даже если простая линейная регрессия использует только одну переменную для объяснения или прогнозирования отклонения другой переменной, поиск простых линейных связей между всеми переменными исследования по-прежнему часто является первым шагом в анализе исследовательских данных. Тот факт, что данные являются многомерными, не означает, что их необходимо изучать с использованием многомерных инструментов. Фактически, начать с базового инструмента, такого как простая линейная регрессия, — это отличный способ начать исследовать закономерности в ваших данных.