出力と確率関数の欠点を解決するデータ調査ツール
このシリーズのパート 1 は、単純線形回帰クラスの 3 つの要素が欠けている状態で終了しました。この記事では、著者 Paul Meagher が PHP ベースの確率関数を使用してこれらの欠点に対処し、出力メソッドを SimpleLinearRegression クラスに統合し、グラフィカル出力を作成する方法を示します。彼は、小規模から中規模のデータ セットに含まれる情報を深く調査するように設計されたデータ調査ツールを構築することで、これらの問題を解決しました。 (パート 1 では、著者は実装言語として PHP を使用して、単純な線形回帰アルゴリズム パッケージのコア部分を開発および実装する方法を示します。)
この 2 部構成シリーズのパート 1 (「PHP を使用した単純な線形の実装」)回帰」)で、数学ライブラリが PHP に役立つ理由を説明しました。また、実装言語として PHP を使用して、単純な線形回帰アルゴリズムのコア部分を開発および実装する方法も示しました。
この記事の目的は、パート 1 で説明した SimpleLinearRegression クラスを使用して重要なデータ調査ツールを構築する方法を示すことです。
簡単なレビュー: 概念
単純な線形回帰モデリングの背後にある基本的な目標は、X 値と Y 値のペア (つまり、X と Y の測定値) で構成される 2 次元平面から最適な直線を見つけることです。最小分散法を使用して線が見つかったら、さまざまな統計テストを実行して、その線が観察された Y 値からの偏差とどの程度一致しているかを判断できます。
線形方程式 (y = mx + b) には、提供された X および Y データから推定する必要がある 2 つのパラメーターがあります。それらは、傾き (m) と y 切片 (b) です。これら 2 つのパラメーターが推定されると、観測値を線形方程式に入力し、方程式によって生成された Y 予測を観測できます。
最小分散法を使用して m および b パラメーターを推定するには、すべての X 値に対する Y の観測値および予測値を最小化する m および b の推定値を見つける必要があります。観測値と予測値の差は誤差 (yi - (mxi + b)) と呼ばれ、各誤差値を 2 乗してこれらの残差を合計すると、結果は数値と呼ばれる予測の 2 乗差になります。最小分散法を使用して最適な直線を決定するには、予測分散を最小化する m と b の推定値を見つけることが含まれます。
最小分散法を満たす推定値 m と b を見つけるには 2 つの基本的な方法があります。最初のアプローチでは、数値検索手順を使用して 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 に基づいて確率関数を開発するには何が必要か」という質問について調査を開始しました。
私はオンラインで情報とコードを探し始めました。両方の情報源は、『Numerical Recipes in C [/url] Probability Functions』という書籍です。いくつかの確率関数コード (gammln.c 関数と betai.c 関数) を PHP で再実装しましたが、まだ結果に満足していません。他の実装よりもコードが少し多いようです。さらに、逆確率関数も必要です。
幸いなことに、私は John Pezullo の対話型統計計算に出会いました。確率分布関数に関する John の Web サイトには、学習を容易にするために必要な関数がすべて JavaScript で実装されています。
Student T 関数と Fisher F 関数を PHP に移植しました。 Java 命名スタイルに準拠するように API を少し変更し、すべての関数を Distribution というクラスに埋め込みました。この実装の優れた機能は、このライブラリ内のすべての関数で再利用される doCommonMath メソッドです。わざわざ実装しなかった他のテスト (正規性テストとカイ 2 乗テスト) も doCommonMath メソッドを使用します。
この移植の別の側面も注目に値します。 JavaScript を使用すると、ユーザーは動的に決定された値をインスタンス変数に割り当てることができます。例:
var PiD2 = pi() / 2
これは PHP では実行できません。インスタンス変数には単純な定数値のみを割り当てることができます。この欠陥が PHP5 で解決されることを願っています。
リスト 1 のコードではインスタンス変数が定義されていないことに注意してください。これは、JavaScript バージョンでは値が動的に割り当てられるためです。
リスト 1. 確率関数の実装
// Distribution.php
// Copyright John Pezullo
// PHP と同じ条件でリリース
// Paul Meagher による PHP ポートと OO'fying。
クラス分布 {
function doCommonMath($q, $i, $j, $b) {
$zz = 1;
$k = $i; k <= $j) {
$zz = $zz * $q * $k / ($k - $b);
$z = $z + $zz;
$z を返す
}
関数 getStudentT($t, $df) {
$w = $t / sqrt($df); w );
if ($df == 1) {
return 1 - $th / (pi() / 2)
}
$sth = sin($th); ) ;
if( ($df % 2) ==1 ) {
return
1 - ($th + $sth * $cth * $this->doCommonMath($cth * $cth, 2, $df - 3 , -1))
/ (pi()/2);
} else {
return 1 - $sth * $this->doCommonMath($cth * $cth, 1, $df - 3, -1) ;
}
}
関数 getInverseStudentT($p, $df) {
$dv = 0.5;
$t = 0;
$t = (1 / $v) - 1;
$dv = $dv / 2;
if ( $this->getStudentT($t, $df) > $p) {
$v = $v - $dv;
} else {
$v = $v + $dv;
}
}
return $t;
function getFisherF($f, $n1, $n2) {
//表示されていません
}
function getInverseFisherF($p, $n1, $n2) {
// 実装されていますが、表示されていません
}
}
?> これで、確率を実装しました。 PHP の機能を理解した後、PHP ベースのデータ調査ツールを開発する際に残る唯一の課題は、分析結果を表示する方法を設計することです。
簡単な解決策は、必要に応じてすべてのインスタンス変数の値を画面に表示することです。最初の記事で、バーンアウト研究の線形方程式、T 値、および T 確率を示すときに、まさにそれを行いました。特定の目的で特定の値にアクセスできると便利であり、SimpleLinearRegression はこの使用法をサポートしています。
ただし、結果を出力する別の方法は、出力の一部を体系的にグループ化することです。回帰分析に使用される主要な統計ソフトウェア パッケージの出力を調査すると、それらの出力が同じ方法でグループ化される傾向があることがわかります。多くの場合、要約テーブル、分散分析テーブル、パラメータ推定テーブル、および R 値が含まれます。同様に、次の名前でいくつかの出力メソッドを作成しました:
showsummaryTable()
showAnalysisOfVariance()
showParameterEstimates()
showRValues()
線形予測式を表示するメソッド (getFormula()) もあります。多くの統計ソフトウェア パッケージは式を出力しませんが、ユーザーが上記のメソッドの出力に基づいて式を構築することを期待しています。これは、データのモデル化に最終的に使用する式の最終形式が、次の理由によりデフォルトの式と異なる可能性があることが理由の 1 つです:
1. Y 切片には意味のある解釈がない
2.変換されている可能性があり、最終的な解釈を得るには変換を解除する必要がある場合があります。
これらのメソッドはすべて、出力媒体が Web ページであることを前提としています。これらの集計値を Web ページ以外の媒体に出力したい場合があることを考慮して、これらの出力メソッドを SimpleLinearRegression クラスを拡張したクラスでラップすることにしました。リスト 2 のコードは、出力クラスの一般的なロジックを示すことを目的としています。共通ロジックをより目立たせるために、さまざまな show メソッドを実装するコードが削除されました。
リスト 2. 出力クラスの共通ロジックを示します
// HTML.php
// Copyright 2003, Paul Meagher
// GPL に基づいて配布
include_once "slr/SimpleLinearRegression.php" ;
class SimpleLinearRegressionHTML は SimpleLinearRegression を拡張します {
function SimpleLinearRegressionHTML($X, $Y, $conf_int) {
SimpleLinearRegression::SimpleLinearRegression($X, $Y, $conf_int)
}
function showTablesummary($x_name, $); y_name) { }
function showAnalysisOfVariance() { }
function showParameterEstimates() { }
function showFormula($x_name, $y_name) { }
function showRValues() {}
}
?>
このクラスのコンストラクターは、SimpleLinearRegression クラス コンストラクターの単なるラッパーです。つまり、SimpleLinearRegression 分析の HTML 出力を表示したい場合は、SimpleLinearRegression クラスを直接インスタンス化するのではなく、SimpleLinearRegressionHTML クラスをインスタンス化する必要があります。利点は、SimpleLinearRegression クラスを多くの未使用メソッドで乱雑にすることがなく、他の出力メディアのクラスをより自由に定義できることです (おそらく、異なるメディア タイプに同じ API を実装します)。
グラフィック出力
これまでに実装した出力メソッドはすべて、要約値を HTML 形式で表示します。これらのデータの散布図や線図を GIF、JPEG、または PNG 形式で表示するのにも適しています。
自分で折れ線グラフと分布図を生成するコードを書くよりも、JpGraph という PHP ベースのグラフィック ライブラリを使用する方が良いと思いました。 JpGraph は、Johan Persson によって積極的に開発されており、彼のプロジェクト Web サイトでは次のように説明されています:
最小限のコードによる「速いが不適切な」グラフであっても、非常にきめ細かい制御を必要とする複雑でプロフェッショナルなグラフであっても、JpGraph All は描画を作成します。簡単。 JpGraph は、科学グラフにもビジネス タイプのグラフにも同様に適しています。
JpGraph ディストリビューションには、特定のニーズに合わせてカスタマイズできる多数のサンプル スクリプトが付属しています。 JpGraph をデータ調査ツールとして使用するのは、必要なことと同様の処理を実行するサンプル スクリプトを見つけて、それを特定のニーズに合わせて調整するだけで簡単です。
リスト 3 のスクリプトは、サンプル データ探索ツール (explore.php) から抽出されたもので、ライブラリを呼び出して、Line クラスと Scatter クラスに SimpleLinearRegression 分析からのデータを設定する方法を示しています。このコードのコメントは、Johan Persson (JPGraph コードベースの文書化に優れた仕事をしています) によって書かれました。
リスト 3. サンプル データ調査ツール、explore.php の関数の詳細
//explore.php スクリプトから抽出されたスニペット
include ("jpgraph/jpgraph.php"); /jpgraph_scatter.php");
include ("jpgraph/jpgraph_line.php");
// グラフを作成する
$graph = new Graph(300,200,'auto');
$graph->SetScale( "linlin ");
// タイトルの設定
$graph->title->Set("$title");
$graph->img->SetMargin(50,20,20,40);
$グラフ->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 = new ScatterPlot( $slr ->Y, $slr->X);
$sp1->mark->SetType(MARK_FILLEDCIRCLE);
$sp1->mark->SetFillColor("red"); ;SetColor("blue");
$sp1->SetWeight(3);
// 回帰直線を作成します
$lplot = new LinePlot ($ slr->PredictedY, $slr->X);
$lplot->SetWeight(2);$lplot->SetColor('navy');
// plto を行に追加します
$graph->Add($sp1);
// ... ストローク
$graph_name = "temp/test.png";
$graph->Stroke($graph_name)
?>
?>
データ調査ツール
データ調査ツールは、SimpleLinearRegressionHTML クラスと JpGraph ライブラリのメソッドを呼び出す単一のスクリプト (explore.php) で構成されます。
このスクリプトは単純な処理ロジックを使用します。スクリプトの最初の部分では、送信されたフォーム データに対して基本的な検証を実行します。このフォーム データが検証に合格すると、スクリプトの 2 番目の部分が実行されます。
スクリプトの 2 番目の部分には、データを分析し、概要結果を HTML およびグラフィック形式で表示するコードが含まれています。リスト 4 は、explore.php スクリプトの基本的な構造を示しています。 = 爆発(",", $x_values);
$numX = カウント($X);
if (!empty($y_values)) {
$Y = 爆発(",", $y_values); $numY = count($Y);
}
// 変数が設定されていない場合はエントリデータ入力フォームを表示
if ( (empty($title)) OR (empty($x_name)) OR (empty($x_values) ) OR
(empty($y_name)) OR (empty($conf_int)) OR (empty($y_values)) OR
($numX != $numY) ) {
// 入力フォームを表示するためのコードを省略しました
} else {
include_once "slr/SimpleLinearRegressionHTML.php";
$slr = new SimpleLinearRegressionHTML($X, $Y, $conf_int)
echo "