概念的に
単純な線形回帰モデリングの背後にある基本的な目標は、
X 値と Y 値のペア (つまり、X と Y の測定値) で構成される 2 次元平面から最適な直線を見つけることです。最小分散法を使用して線が見つかったら、さまざまな統計テストを実行して、その線が Y 値から観察された偏差にどの程度適合しているかを判断できます。
線形方程式 (y = mx + b) には、提供された X および Y データから推定する必要がある 2 つのパラメーターがあります。それらは、傾き (m) と y 切片 (b) です。これら 2 つのパラメーターが推定されると、観測値を線形方程式に入力し、方程式によって生成された Y 予測を観測できます。
最小分散法を使用して m および b パラメーターを推定するには、すべての X 値に対する Y の観測値および予測値を最小化する m および b の推定値を見つける必要があります。観測値と予測値の差は誤差 (y i- (mx i+ b) ) と呼ばれ、各誤差値を 2 乗してこれらの残差を合計すると、結果は予測の 2 乗 Bad 数となります。最小分散法を使用して最適な適合を決定するには、予測分散を最小化する m と b の推定値を見つけることが含まれます。
2 つの基本的な方法を使用して、最小分散法を満たす推定値 m および b を見つけることができます。最初のアプローチでは、数値検索プロセスを使用して m と b の異なる値を設定し、それらを評価し、最終的に分散が最小になる推定値を決定します。 2 番目の方法は、微積分を使用して m と b を推定するための方程式を見つける方法です。これらの方程式の導出に関わる微積分には立ち入りませんが、SimpleLinearRegression クラスでこれらの分析方程式を使用して、m と b の最小二乗推定値を求めました (SimpleLinearRegression クラス メソッドの getSlope() と getYIntercept を参照)。
m と b の最小二乗推定値を見つけるために使用できる方程式がある場合でも、これらのパラメーターを一次方程式に代入すると、結果がデータによく適合する直線になるとは限りません。この単純な線形回帰プロセスの次のステップは、残りの予測分散が許容できるかどうかを判断することです。
統計的決定プロセスを使用して、直線がデータに適合するという対立仮説を棄却できます。このプロセスは、確率関数を使用してランダムに大きな観測値の確率を求める T 統計量の計算に基づいています。パート 1 で説明したように、SimpleLinearRegression クラスは多数の集計値を生成します。重要な集計値の 1 つは、線形方程式がデータにどの程度適合しているかを測定するために使用できる T 統計量です。適合が良好な場合、T 統計量は大きな値になる傾向があります。T 値が小さい場合は、Y 値の平均が最良の予測子であると仮定するデフォルトのモデルに線形方程式を置き換える必要があります (なぜなら、一連の値の平均は、次の観測値を予測するのに役立つことが多いからです)。
T 統計量が、平均 Y 値を最良の予測因子として使用できないほど大きいかどうかをテストするには、T 統計量をランダムに取得する確率を計算する必要があります。確率が低い場合は、平均が最良の予測子であるという帰無仮定を省くことができるため、単純な線形モデルがデータによく適合していると確信できます。 (T 統計の確率の計算の詳細については、パート 1 を参照してください。)
統計的意思決定プロセスに戻ります。帰無仮説を採用すべきでない場合は教えてくれますが、対立仮説を受け入れるかどうかは教えてくれません。研究環境では、理論的および統計的パラメーターを通じて線形モデルの対立仮説を確立する必要があります。
構築するデータ調査ツールは、線形モデルの統計的意思決定プロセス (T テスト) を実装し、線形モデルの構築に必要な理論的および統計的パラメーターの構築に使用できる概要データを提供します。データ調査ツールは、ナレッジ ワーカーが小規模から中規模のデータ セットのパターンを研究するための意思決定支援ツールとして分類できます。
学習の観点から見ると、単純な線形回帰モデリングは、より高度な形式の統計モデリングを理解する唯一の方法であるため、研究する価値があります。たとえば、単純な線形回帰の多くの中心的な概念は、重回帰 (重回帰)、因子分析 (因子分析)、および時系列 (時系列) を理解するための優れた基礎を確立します。
単純な線形回帰も多用途のモデリング手法です。これを使用して、生データを変換する (通常は対数変換またはべき乗変換を使用) ことによって、曲線データをモデル化できます。これらの変換によりデータが線形化され、単純な線形回帰を使用してモデル化できるようになります。結果として得られる線形モデルは、変換された値に関連する線形式として表されます。
確率関数
前回の記事では、R に確率値を求めるように依頼することで、PHP で確率関数を実装するという問題を回避しました。私はこの解決策に完全には満足できなかったので、PHP に基づいて確率関数を開発するには何が必要かという疑問について調査を開始しました。
私はオンラインで情報とコードを探し始めました。両方の情報源の 1 つは、書籍「Numerical Recipes in C. Probability Functions」です。いくつかの確率関数コード (gammln.c 関数と betai.c 関数) を PHP で再実装しましたが、まだ結果に満足していません。他の実装よりもコードが少し多いようです。さらに、逆確率関数も必要です。
幸いなことに、私は John Pezullo の Interactive Statistical Calculation に出会いました。確率分布関数に関する John の Web サイトには、学習を容易にするために必要な関数がすべて JavaScript で実装されています。
Student T 関数と Fisher F 関数を PHP に移植しました。 Java 命名スタイルに準拠するように API を少し変更し、すべての関数を Distribution というクラスに埋め込みました。この実装の優れた機能は、このライブラリ内のすべての関数で再利用される doCommonMath メソッドです。わざわざ実装しなかった他のテスト (正規性テストとカイ 2 乗テスト) も doCommonMath メソッドを使用します。
この移植の別の側面も注目に値します。 JavaScript を使用すると、ユーザーは動的に決定された値を次のようなインスタンス変数に割り当てることができます。
var PiD2 = pi() / 2
PHP ではこれを行うことはできません。インスタンス変数には単純な定数値のみを割り当てることができます。この欠陥は PHP5 で解決されることを願っています。
リスト 1 のコードではインスタンス変数が定義されていないことに注意してください。これは、JavaScript バージョンでは値が動的に割り当てられるためです。
リスト 1. 確率関数の実装
<?php
// Distribution.php
// Copyright John Pezullo
// PHP と同じ条件でリリースされます。
// Paul Meagher による PHP ポートと OO の計算
class Distribution {
function doCommonMath($q, $i, $j, $b) {
$zz = 1;
$z = $zz;
$k = $i;
while($k <= $j) {
$zz = $zz * $q * $k / ($k - $b);
$z = $z + $zz;
$k = $k + 2;
}
$z を返します。
}
関数 getStudentT($t, $df) {
$t = abs($t);
$w = $t / sqrt($df);
$th = atan($w);
if ($df == 1) {
1 - $th / (pi() / 2) を返します。
}
$sth = sin($th);
$cth = cos($th);
if( ($df % 2) ==1 ) {
戻る
1 - ($th + $sth * $cth * $this->doCommonMath($cth * $cth, 2, $df - 3, -1))
/ (pi()/2);
} それ以外 {
return 1 - $sth * $this->doCommonMath($cth * $cth, 1, $df - 3, -1);
}
}
関数 getInverseStudentT($p, $df) {
$v = 0.5;
$dv = 0.5;
$t = 0;
while($dv > 1e-6) {
$t = (1 / $v) - 1;
$dv = $dv / 2;
if ( $this->getStudentT($t, $df) > $p) {
$v = $v - $dv;
} それ以外 {
$v = $v + $dv;
}
}
$t を返します。
}
関数 getFisherF($f, $n1, $n2) {
// 実装されているが表示されていない
関数 getInverseFisherF($p, $n1, $n2)
{
// 実装されているが表示されていない
}
}
?>
出力メソッド
PHP で確率関数を実装したので、PHP ベースのデータ調査ツールの開発で残る唯一の課題は、分析結果を表示するメソッドを設計することです。
簡単な解決策は、必要に応じてすべてのインスタンス変数の値を画面に表示することです。最初の記事で、バーンアウト研究の線形方程式、T 値、および T 確率を示すときに、まさにそれを行いました。特定の目的で特定の値にアクセスできると便利であり、SimpleLinearRegression はこの使用法をサポートしています。
ただし、結果を出力する別の方法は、出力の一部を体系的にグループ化することです。回帰分析に使用される主要な統計ソフトウェア パッケージの出力を調査すると、それらの出力が同じ方法でグループ化される傾向があることがわかります。多くの場合、要約テーブル、分散分析テーブル、パラメータ推定テーブル、R 値が含まれます。同様に、次の名前の出力メソッドをいくつか作成しました:
showsummaryTable()
分散分析を表示()
showParameterEstimates()
showRValues()
線形予測式を表示するメソッド ( getFormula() ) もあります。多くの統計ソフトウェア パッケージは式を出力しませんが、ユーザーが上記のメソッドの出力に基づいて式を構築することを期待しています。これは、データのモデル化に最終的に使用する式の最終形式が、次の理由によりデフォルトの式と異なる可能性があることが理由の 1 つです:
Y 切片に意味のある解釈がない可能性がある、または入力値が変換されている可能性があります。最終的な説明を得るには変換を解除する必要があるかもしれません。
これらの方法はすべて、出力媒体が Web ページであることを前提としています。これらの集計値を Web ページ以外の媒体に出力したい場合があることを考慮して、これらの出力メソッドを SimpleLinearRegression クラスを継承したクラスでラップすることにしました。 リスト 2 のコードは、出力クラスの一般的なロジックを示すことを目的としています。共通ロジックをより目立たせるために、さまざまな show メソッドを実装するコードが削除されました。
リスト 2. 出力クラスの共通ロジックのデモ
<?php
// HTML.php
// 著作権 2003、Paul Meagher
// GPL で配布
include_once "slr/SimpleLinearRegression.php";
class SimpleLinearRegressionHTML extends SimpleLinearRegression {
function SimpleLinearRegressionHTML($X, $Y, $conf_int) {
SimpleLinearRegression::SimpleLinearRegression($X, $Y, $conf_int);
関数 showTablesummary($x_name, $y_name) {
}
関数 showAnalysisOfVariance() { }
関数 showParameterEstimates() { }
関数 showFormula($x_name, $y_name) { }
関数 showRValues() {}
}
?>
このクラスのコンストラクターは、SimpleLinearRegression クラス コンストラクターの単なるラッパーです。つまり、SimpleLinearRegression 分析の HTML 出力を表示したい場合は、SimpleLinearRegression クラスを直接インスタンス化するのではなく、SimpleLinearRegressionHTML クラスをインスタンス化する必要があります。利点は、SimpleLinearRegression クラスが多くの未使用メソッドで乱雑にならず、他の出力メディアのクラスをより自由に定義できることです (おそらく、異なるメディア タイプに同じ API を実装します)。
グラフィカル出力
これまでに実装した出力メソッドは、HTML 形式で概要値を表示します。これらのデータの散布図や線図を GIF、JPEG、または PNG 形式で表示するのにも適しています。
私は、折れ線グラフや分布図を生成するコードを自分で書くよりも、JpGraph という PHP ベースのグラフィック ライブラリを使用する方がよいと考えました。 JpGraph は Johan Persson によって積極的に開発されており、彼のプロジェクト Web サイトでは次のように説明されています。
最小限のコードで「迅速だが不適切な方法で取得された」グラフでも、非常にきめ細かい制御が必要な複雑で専門的なグラフでも、JpGraph は使用できます。それらは簡単になります。 JpGraph は、科学グラフにもビジネス タイプのグラフにも同様に適しています。
JpGraph ディストリビューションには、特定のニーズに合わせてカスタマイズできるサンプル スクリプトが多数含まれています。 JpGraph をデータ調査ツールとして使用するのは、必要なことと同様の処理を実行するサンプル スクリプトを見つけて、それを特定のニーズに合わせて調整するだけで簡単です。
リスト 3 のスクリプトは、サンプル データ探索ツール (explore.php) から抽出されたもので、ライブラリを呼び出して、Line クラスと Scatter クラスに SimpleLinearRegression 分析のデータを設定する方法を示しています。このコードのコメントは Johan Persson によって書かれました (JPGraph コード ベースはそれをうまく文書化しています)。
リスト 3. サンプル データ探索ツール explore.php の関数の詳細
<?php
//explore.php スクリプトから抽出されたスニペット
include ("jpgraph/jpgraph.php");
include ("jpgraph/jpgraph_scatter.php");
include ("jpgraph/jpgraph_line.php");
// グラフを作成します。
$graph = 新しいグラフ(300,200,'auto');
$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 = 新しい散布図($slr->Y, $slr->X);
$sp1->mark->SetType(MARK_FILLEDCIRCLE);
$sp1->mark->SetFillColor("red");
$sp1->SetColor("青");
$sp1->SetWeight(3);
$sp1->mark->SetWidth(4)
// 回帰直線を作成します
。
$lplot = new LinePlot($slr->PredictedY, $slr->X);
$lplot->SetWeight(2);
$lplot->SetColor('navy');
// plto を行に追加します。
$graph->Add($sp1);
$graph->Add($lplot);
// ... そしてストローク
$graph_name = "temp/test.png";
$graph->Stroke($graph_name);
?>
<img src='<?php echo $graph_name ?>' vspace='15'>
?>
データ調査スクリプト データ
調査ツールは、SimpleLinearRegressionHTML クラスと JpGraph ライブラリのメソッドを呼び出す単一のスクリプト (explore.php) で構成されます。 。
このスクリプトは単純な処理ロジックを使用します。スクリプトの最初の部分では、送信されたフォーム データに対して基本的な検証を実行します。このフォーム データが検証に合格すると、スクリプトの 2 番目の部分が実行されます。
スクリプトの 2 番目の部分には、データを分析し、要約結果を HTML およびグラフィック形式で表示するコードが含まれています。 explore.php スクリプトの基本構造をリスト 4 に示します。
リスト 4.explore.php の構造
<?php
//explore.php
if (!empty($x_values)) {
$X =explode(",", $x_values);
$numX = カウント($X);
if (!empty($y_values))
{
$Y =explode(",", $y_values);
$numY = カウント($Y);
}
// 変数が設定されていない場合はエントリ データ入力フォームを表示
if ( (empty($title)) OR (empty($x_name)) OR (empty($x_values)) OR
(空($y_name)) OR (空($conf_int)) OR (空($y_values)) OR
($numX != $numY) ) {
// 入力フォーム表示用コード省略
} それ以外 {
include_once "slr/SimpleLinearRegressionHTML.php";
$slr = new SimpleLinearRegressionHTML($X, $Y, $conf_int);
echo "<h2>$title</h2>";
$slr->showTablesummary($x_name, $y_name);
echo "<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");
include ("jpgraph/jpgraph_scatter.php");
include ("jpgraph/jpgraph_line.php");
// グラフィックスを表示するコードはインラインにあります。
// これら 2 つの折れ線グラフのコードは、explore.php スクリプトです。
// スクリプトを終了します:
// 散布図と折れ線グラフを表示するための省略されたコード
// 残差プロットを表示するためのコードを省略
}
?>
火災被害調査
データ調査ツールの使用方法を示すために、仮想の火災被害調査からのデータを使用します。この研究は、主要な住宅地域における火災被害の額と、最寄りの消防署からの距離とを関連付けています。たとえば、保険会社は保険料を決定する目的でこの関係の研究に興味を持つでしょう。
この研究のデータは、図 1 の入力画面に示されています。
図 1. 研究データを表示する入力画面
データが送信されると分析され、分析結果が表示されます。図 2 に示すように、最初に表示される結果セットはTable Summaryです。
図 2. テーブルの概要は最初に表示される結果セットです
テーブル サマリーには、入力データが表形式で表示され、観測値に対応する予測値 Yを示す追加の列が表示されます。
図 3 は、表の概要に続く 3 つの高レベルのデータ概要表を示しています。
図 3. 表の概要に続く 3 つの高レベルのデータ概要表を示します。
分散分析表は、 Y値の偏差が、モデルによって説明される分散 (「モデル」行を参照) とモデルによって説明されない分散 (「誤差」行を参照) という 2 つの主な偏差原因にどのように起因するかを示します。 F値が大きいということは、線形モデルがY測定値の偏差の大部分を捉えていることを意味します。このテーブルは、各独立変数がテーブル内に行を持つ重回帰環境でより役立ちます。
パラメーター推定テーブルには、推定された Y 軸切片 (Intercept) と傾き (Slope) が表示されます。各行には、 T値と、極値のT値が観測される確率が含まれています (Prob > T 列を参照)。傾きのProb > T を使用して、線形モデルを棄却できます。
T値の確率が 0.05 より大きい (または同様に小さい確率) 場合は、極値がランダムに観測される確率が小さいため、帰無仮説を棄却できます。それ以外の場合は、帰無仮説を使用する必要があります。
火災損失の研究では、サイズ 12.57 のT値をランダムに取得する確率は 0.00000 未満です。これは、線形モデルが、この研究で観察されたX値の範囲に対応するY値の有用な予測子 ( Y値の平均よりも優れている) であることを意味します。
最終レポートには、相関係数またはR 値が表示されます。これらは、線形モデルがデータにどの程度適合しているかを評価するために使用できます。高い R 値は、良好な一致を示します。
各概要レポートは、線形モデルとデータの関係に関するさまざまな分析上の質問に対する回答を提供します。回帰分析のより高度な処理については、Hamilton、Neter、または Pedhauzeur の教科書を参照してください。
表示される最終的なレポート要素は、図 4 に示すように、データの分布プロットと折れ線グラフです。
図 4. 最終レポートの要素 - 分布プロットと折れ線グラフ
ほとんどの人は折れ線グラフ (このシリーズの最初のグラフなど) の説明に精通しているので、これについてはコメントしませんが、JPGraph ライブラリは Web 用の高品質な科学グラフを生成できるということだけを述べます。分布データや直線データを入力するときにも優れた機能を発揮します。
2 番目のプロットは、残差 (観測されたY 、予測されたY ) を予測されたY値に関連付けます。これは、データ内のパターンを検出して理解するアナリストの能力を最大限に高めるために、探索的データ分析 (EDA) の提唱者によって使用されるグラフの例です。専門家はこの図を使用して、次の質問に答えることができます。
このデータ調査ツールは簡単に拡張して、より多くの種類のグラフを作成できます — ヒストグラム、ボックスプロット、および四分位プロット - これらは標準の EDA ツールです。
数学ライブラリのアーキテクチャ
私は数学が趣味なので、ここ数か月間、数学ライブラリに興味を持ち続けています。このような調査を行うことで、コード ベースを整理し、将来の成長を予測する方法を考えるようになります。
ここでは、リスト 5 のディレクトリ構造を使用します。
リスト 5. 拡張しやすいディレクトリ構造
phpmath/ burnout_study.php 探索.php fire_study.php ナビバー.php 距離/ 配布.php フィッシャー.php 学生.php ソース.php jpグラフ/ 等... 一眼レフ/ SimpleLinearRegression.php SimpleLinearRegressionHTML.php 温度/ |
将来的には、PHP_MATH 変数の設定は、PHP 数学ライブラリ全体の構成ファイルを通じて行われる予定です。
何を学びましたか?
この記事では、SimpleLinearRegression クラスを使用して、小規模から中規模のデータ セット用のデータ調査ツールを開発する方法を学びました。その過程で、SimpleLinearRegression クラスで使用するネイティブ確率関数も開発し、HTML 出力メソッドと JpGraph ライブラリに基づくグラフ生成コードを使用してクラスを拡張しました。
学習の観点から見ると、単純な線形回帰モデリングは、より高度な形式の統計モデリングを理解する唯一の方法であることが証明されているため、さらに研究する価値があります。重回帰や多変量分散分析などのより高度な手法に取り組む前に、単純な線形回帰をしっかりと理解することが重要です。
単純な線形回帰では、別の変数の偏差を説明または予測するために 1 つの変数のみが使用される場合でも、すべての研究変数間の単純な線形関係を見つけることが研究データ分析の最初のステップとなることがよくあります。データが多変量であるからといって、多変量ツールを使用して調査する必要があるというわけではありません。実際、単純な線形回帰などの基本的なツールから始めることは、データ内のパターンの探索を開始するための優れた方法です。