L'objectif fondamental de
la modélisation de régression linéaireconceptuellement
simple est de trouver la meilleure ligne droite à partir d'un plan bidimensionnel composé de paires de valeurs X et Y (c'est-à-dire des mesures X et Y).Une fois la ligne trouvée à l'aide de la méthode de variance minimale, divers tests statistiques peuvent être effectués pour déterminer dans quelle mesure la ligne correspond à l'écart observé par rapport à la valeur Y.
L'équation linéaire (y = mx + b) a deux paramètres qui doivent être estimés à partir des données X et Y fournies, ce sont la pente (m) et l'ordonnée à l'origine (b). Une fois ces deux paramètres estimés, vous pouvez saisir les valeurs observées dans l'équation linéaire et observer les prédictions Y générées par l'équation.
Pour estimer les paramètres m et b à l'aide de la méthode de la variance minimale, nous devons trouver les valeurs estimées de m et b qui minimisent les valeurs observées et prédites de Y pour toutes les valeurs X. La différence entre les valeurs observées et prédites est appelée l'erreur ( y i- (mx i+ b) ), et si vous mettez au carré chaque valeur d'erreur puis additionnez ces résidus, le résultat est une prédiction au carré d'un mauvais nombre. L’utilisation de la méthode de la variance minimale pour déterminer le meilleur ajustement implique de trouver des estimations de m et b qui minimisent la variance de prédiction.
Deux méthodes de base peuvent être utilisées pour trouver les estimations m et b qui satisfont à la méthode de la variance minimale. Dans la première approche, on peut utiliser un processus de recherche numérique pour définir différentes valeurs de m et b et les évaluer, pour finalement décider de l'estimation qui donne la variance minimale. La deuxième méthode consiste à utiliser le calcul pour trouver des équations permettant d’estimer m et b. Je ne vais pas entrer dans le calcul impliqué dans la dérivation de ces équations, mais j'ai utilisé ces équations analytiques dans la classe SimpleLinearRegression pour trouver les estimations des moindres carrés de m et b (voir getSlope() et getYIntercept dans la méthode de classe SimpleLinearRegression).
Même si vous disposez d'équations qui peuvent être utilisées pour trouver des estimations des moindres carrés de m et b, cela ne signifie pas que si vous branchez ces paramètres dans une équation linéaire, le résultat sera une ligne droite qui correspond bien aux données. L'étape suivante de ce processus de régression linéaire simple consiste à déterminer si la variance de prédiction restante est acceptable.
Vous pouvez utiliser un processus de décision statistique pour rejeter l’hypothèse alternative selon laquelle la ligne droite correspond aux données. Ce processus est basé sur le calcul de la statistique T, en utilisant une fonction de probabilité pour trouver la probabilité d'une observation aléatoirement grande. Comme mentionné dans la première partie, la classe SimpleLinearRegression génère un certain nombre de valeurs récapitulatives, l'une des valeurs récapitulatives importantes étant la statistique T, qui peut être utilisée pour mesurer dans quelle mesure l'équation linéaire s'adapte aux données. Si l'ajustement est bon, la statistique T aura tendance à être une valeur élevée ; si la valeur T est petite, vous devez remplacer votre équation linéaire par un modèle par défaut qui suppose que la moyenne des valeurs Y est le meilleur prédicteur ( car La moyenne d'un ensemble de valeurs peut souvent être un prédicteur utile de la prochaine observation).
Pour tester si la statistique T est suffisamment grande pour ne pas utiliser la valeur moyenne de Y comme meilleur prédicteur, vous devez calculer la probabilité d’obtenir la statistique T de manière aléatoire. Si la probabilité est faible, alors l’hypothèse nulle selon laquelle la moyenne est le meilleur prédicteur peut être supprimée et, par conséquent, on peut être sûr qu’un modèle linéaire simple est bien adapté aux données. (Voir la partie 1 pour plus d'informations sur le calcul de la probabilité d'une statistique T.)
Revenez au processus de prise de décision statistique. Il vous indique quand ne pas adopter l’hypothèse nulle, mais il ne vous dit pas s’il faut accepter l’hypothèse alternative. Dans un contexte de recherche, des hypothèses alternatives au modèle linéaire doivent être établies à l’aide de paramètres théoriques et statistiques.
L'outil de recherche de données que vous construirez met en œuvre un processus de prise de décision statistique pour les modèles linéaires (tests T) et fournit des données récapitulatives qui peuvent être utilisées pour construire les paramètres théoriques et statistiques nécessaires à la construction de modèles linéaires. Les outils de recherche de données peuvent être classés comme des outils d’aide à la décision permettant aux travailleurs du savoir d’étudier des modèles dans des ensembles de données de petite à moyenne taille.
Du point de vue de l’apprentissage, la modélisation de régression linéaire simple mérite d’être étudiée car c’est le seul moyen de comprendre des formes plus avancées de modélisation statistique. Par exemple, de nombreux concepts de base de la régression linéaire simple établissent une bonne base pour comprendre la régression multiple (Multiple Regression), l'analyse factorielle (Factor Analysis) et les séries chronologiques (Time Series).
La régression linéaire simple est également une technique de modélisation polyvalente. Il peut être utilisé pour modéliser des données curvilignes en transformant les données brutes (généralement avec une transformation logarithmique ou de puissance). Ces transformations linéarisent les données afin qu'elles puissent être modélisées à l'aide d'une simple régression linéaire. Le modèle linéaire résultant sera représenté sous la forme d'une formule linéaire liée aux valeurs transformées.
Fonction de probabilité
Dans l'article précédent, j'ai évité le problème de l'implémentation de la fonction de probabilité en PHP en demandant à R de trouver la valeur de probabilité. Je n'étais pas entièrement satisfait de cette solution, j'ai donc commencé à rechercher la question : que faut-il pour développer des fonctions de probabilité basées sur PHP.
J'ai commencé à chercher des informations et du code en ligne. Une source pour les deux est le livre Numerical Recipes in C. Probability Functions. J'ai réimplémenté du code de fonction de probabilité (fonctions gammln.c et betai.c) en PHP, mais je ne suis toujours pas satisfait des résultats. Il semble avoir un peu plus de code que certaines autres implémentations. De plus, j'ai besoin de la fonction de probabilité inverse.
Heureusement, je suis tombé sur le calcul statistique interactif de John Pezzullo. Le site Web de John sur les fonctions de distribution de probabilité possède toutes les fonctions dont j'ai besoin, implémentées en JavaScript pour faciliter l'apprentissage.
J'ai porté les fonctions Student T et Fisher F vers PHP. J'ai légèrement modifié l'API pour la conformer au style de dénomination Java et intégré toutes les fonctions dans une classe appelée Distribution. Une fonctionnalité intéressante de cette implémentation est la méthode doCommonMath, qui est réutilisée par toutes les fonctions de cette bibliothèque. D'autres tests que je n'ai pas pris la peine de mettre en œuvre (test de normalité et test du chi carré) utilisent également la méthode doCommonMath.
Un autre aspect de cette greffe mérite également d’être souligné. En utilisant JavaScript, les utilisateurs peuvent attribuer des valeurs déterminées dynamiquement aux variables d'instance, telles que :
var PiD2 = pi() / 2
Vous ne pouvez pas faire cela en PHP. Seules des valeurs constantes simples peuvent être attribuées aux variables d'instance. Espérons que cette faille soit résolue dans PHP5.
Notez que le code du listing 1 ne définit pas de variables d'instance, car dans la version JavaScript, ce sont des valeurs affectées dynamiquement.
Listing 1. Implémentation de la fonction de probabilité
<?php
// Distribution.php
// Copyright John Pezullo
// Publié sous les mêmes conditions que PHP.
// Portage PHP et OO'fying par Paul Meagher
class Distribution {
function doCommonMath($q, $i, $j, $b) {
$zz = 1 ;
$z = $zz;
$k = $i ;
tandis que($k <= $j) {
$zz = $zz * $q * $k / ($k - $b);
$z = $z + $zz ;
$k = $k + 2 ;
}
retourner $z ;
}
function getStudentT($t, $df) {
$t = abs($t);
$w = $t / sqrt($df);
$th = atan($w);
si ($df == 1) {
return 1 - $th / (pi() / 2);
}
$qch = péché($th);
$cth = cos($th);
si( ($df % 2) ==1 ) {
retour
1 - ($th + $sth * $cth * $this->doCommonMath($cth * $cth, 2, $df - 3, -1))
/ (pi()/2);
} autre {
return 1 - $sth * $this->doCommonMath($cth * $cth, 1, $df - 3, -1);
}
}
fonction getInverseStudentT($p, $df) {
$ v = 0,5 ;
$dv = 0,5 ;
$t = 0 ;
tandis que($dv > 1e-6) {
$t = (1 / $v) - 1 ;
$dv = $dv / 2 ;
if ( $this->getStudentT($t, $df) > $p) {
$v = $v - $dv ;
} autre {
$v = $v + $dv ;
}
}
retourner $t ;
}
fonction getFisherF($f, $n1, $n2) {
// implémenté mais non affiché
}
fonction getInverseFisherF($p, $n1, $n2) {
// implémenté mais non affiché
}
}
?>
Méthodes de sortie
Maintenant que vous avez implémenté la fonction de probabilité en PHP, le seul défi restant dans le développement d'un outil de recherche de données basé sur PHP est de concevoir une méthode d'affichage des résultats de l'analyse.
La solution simple consiste à afficher les valeurs de toutes les variables d'instance à l'écran selon les besoins. Dans le premier article, c'est exactement ce que j'ai fait en montrant l'équation linéaire, la valeur T et la probabilité T pour l'étude sur l'épuisement professionnel. Il est utile de pouvoir accéder à des valeurs spécifiques à des fins spécifiques, et SimpleLinearRegression prend en charge cette utilisation.
Cependant, une autre méthode pour produire des résultats consiste à regrouper systématiquement des parties de la sortie. Si vous étudiez les résultats des principaux logiciels statistiques utilisés pour l’analyse de régression, vous constaterez qu’ils ont tendance à regrouper leurs résultats de la même manière. Ils comprennent souvent un tableau récapitulatif, un tableau d'analyse de la variance, un tableau d'estimation des paramètres et une valeur R. De même, j'ai créé des méthodes de sortie avec les noms suivants :
showSummaryTable()
showAnalysisOfVariance()
showParameterEstimates()
showRValues()
J'ai également une méthode pour afficher la formule de prédiction linéaire ( getFormula() ). De nombreux logiciels statistiques ne génèrent pas de formules, mais attendent de l'utilisateur qu'il construise des formules basées sur les résultats des méthodes ci-dessus. Cela est dû en partie au fait que la forme finale de la formule que vous utilisez pour modéliser vos données peut différer de la formule par défaut pour les raisons suivantes :
L'ordonnée à l'origine peut ne pas avoir d'interprétation significative, ou les valeurs d'entrée peuvent avoir été transformées. d'une manière dont vous pourriez avoir besoin de les déconvertir pour obtenir l'explication finale.
Toutes ces méthodes supposent que le support de sortie est une page Web. Étant donné que vous souhaiterez peut-être afficher ces valeurs récapitulatives sur un support autre qu'une page Web, j'ai décidé d'envelopper ces méthodes de sortie dans une classe qui hérite de la classe SimpleLinearRegression. Le code du listing 2 est destiné à démontrer la logique générale de la classe de sortie. Afin de rendre la logique commune plus visible, le code qui implémente diverses méthodes show a été supprimé.
Listing 2. Démonstration de la logique commune de la classe de sortie
<?php
// HTML.php
// Copyright 2003, Paul Meagher
// Distribué sous GPL
include_once "slr/SimpleLinearRegression.php";
class SimpleLinearRegressionHTML extends SimpleLinearRegression {
function SimpleLinearRegressionHTML($X, $Y, $conf_int) {
SimpleLinearRegression :: SimpleLinearRegression ($ X, $ Y, $ conf_int);
}
fonction showTableSummary($x_name, $y_name) { }
fonction showAnalysisOfVariance() { }
fonction showParameterEstimates() { }
fonction showFormula($x_name, $y_name) { }
fonction showRValues() {}
}
?>
Le constructeur de cette classe n'est qu'un wrapper autour du constructeur de la classe SimpleLinearRegression. Cela signifie que si vous souhaitez afficher la sortie HTML d'une analyse SimpleLinearRegression, vous devez instancier la classe SimpleLinearRegressionHTML au lieu d'instancier directement la classe SimpleLinearRegression. L'avantage est que vous n'encombrez pas la classe SimpleLinearRegression avec de nombreuses méthodes inutilisées et que vous pouvez définir plus librement des classes pour d'autres supports de sortie (en implémentant peut-être la même API pour différents types de supports).
Sortie graphiqueLes
méthodes de sortie que vous avez implémentées jusqu'à présent affichent les valeurs récapitulatives au format HTML. Il convient également pour afficher des nuages de points ou des tracés linéaires de ces données au format GIF, JPEG ou PNG.
Plutôt que d'écrire moi-même le code pour générer des tracés de courbes et de distribution, j'ai pensé qu'il serait préférable d'utiliser une bibliothèque graphique basée sur PHP appelée JpGraph. JpGraph est activement développé par Johan Persson, dont le site Web du projet le décrit ainsi :
Que ce soit pour des graphiques "obtenus de manière rapide mais inappropriée" avec un minimum de code, ou pour des graphiques professionnels complexes nécessitant un contrôle très fin, JpGraph peut être utilisé pour dessiner. cela devient facile. JpGraph convient également aux graphiques de type scientifique et commercial.
La distribution JpGraph comprend un certain nombre d'exemples de scripts qui peuvent être personnalisés pour des besoins spécifiques. Utiliser JpGraph comme outil de recherche de données est aussi simple que de trouver un exemple de script qui fait quelque chose de similaire à ce dont j'ai besoin et de l'adapter à mes besoins spécifiques.
Le script du listing 3 est extrait de l'exemple d'outil d'exploration de données (explore.php) et montre comment appeler la bibliothèque et remplir les classes Line et Scatter avec les données de l'analyse SimpleLinearRegression. Les commentaires dans ce code ont été rédigés par Johan Persson (la base de code JPGraph fait un bon travail en le documentant).
Listing 3. Détails des fonctions de l'exemple d'outil d'exploration de données explore.php
<?php
// Extrait extrait du script explore.php
include ("jpgraph/jpgraph.php");
include ("jpgraph/jpgraph_scatter.php");
include ("jpgraph/jpgraph_line.php");
// Créer le graphique
$graph = nouveau graphique(300 200,'auto');
$graph->SetScale("linlin");
// Titre de configuration
$graph->titre->Set("$titre");
$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);
// assurez-vous que l'axe X est toujours au niveau
// en bas du tracé et pas seulement à Y=0, ce qui est
// la position par défaut
$graph->xaxis->SetPos('min');
// Crée le nuage de points avec de jolies couleurs
$sp1 = nouveau nuage de points ($slr->Y, $slr->X);
$sp1->mark->SetType(MARK_FILLEDCIRCLE);
$sp1->mark->SetFillColor("rouge");
$sp1->SetColor("bleu");
$sp1->SetWeight(3);
$sp1->mark->SetWidth(4);
// Crée la droite de régression
$lplot = nouveau LinePlot($slr->PredictedY, $slr->X);
$lplot->SetWeight(2);
$lplot->SetColor('navy');
// Ajoute les pltos à la ligne
$graph->Ajouter($sp1);
$graph->Add($lplot);
// ... et trait
$graph_name = "temp/test.png";
$graph->Coup ($graph_name);
?>
<img src='<?php echo $graph_name ?>' vspace='15'>
?>
Script de recherche de données
L'outil de recherche de données est constitué d'un seul script (explore.php) qui appelle les méthodes de la classe SimpleLinearRegressionHTML et de la bibliothèque JpGraph. .
Le script utilise une logique de traitement simple. La première partie du script effectue une validation de base sur les données du formulaire soumis. Si les données de ce formulaire réussissent la validation, la deuxième partie du script est exécutée.
La deuxième partie du script contient du code qui analyse les données et affiche les résultats récapitulatifs aux formats HTML et graphiques. La structure de base du script explore.php est présentée dans le listing 4 :
Listing 4. Structure de explore.php
<?php
// explore.php
if (!empty($x_values)) {
$X = exploser(",", $x_values);
$numX = nombre($X);
}
if (!empty($y_values)) {
$Y = exploser(",", $y_values);
$numY = nombre($Y);
}
// affiche le formulaire de saisie des données d'entrée si les variables ne sont pas définies
if ( (empty($title)) OR (empty($x_name)) OR (empty($x_values)) OR
(vide($y_name)) OU (vide($conf_int)) OU (vide($y_values)) OU
($numX != $numY) ) {
// Code omis pour afficher le formulaire d'inscription
} autre {
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");
// Le code d'affichage des graphiques est en ligne dans le
// Script explore.php. Le code de ces deux tracés linéaires.
// termine le script :
// Code omis pour l'affichage du nuage de points et du tracé linéaire
// Code omis pour afficher le tracé des résidus
}
?>
Etude des dégâts dus au feu
Pour démontrer comment utiliser les outils de recherche de données, j'utiliserai les données d'une étude hypothétique des dommages causés par un incendie. Cette étude relie l'ampleur des dégâts causés par le feu dans les principales zones résidentielles à leur distance par rapport à la caserne de pompiers la plus proche. Par exemple, les compagnies d’assurance seraient intéressées à étudier cette relation afin de déterminer les primes d’assurance.
Les données de cette étude sont présentées dans l'écran de saisie de la figure 1.
Figure 1. Écran de saisie affichant les données de l'étude
Une fois les données soumises, elles sont analysées et les résultats de ces analyses sont affichés. Le premier ensemble de résultats affiché est le tableau récapitulatif , comme le montre la figure 2.
Figure 2. Le résumé du tableau est le premier ensemble de résultats affiché
Le résumé du tableau affiche les données d'entrée sous forme de tableau et des colonnes supplémentaires indiquant la valeur prédite Y correspondant à la valeur observée.
La figure 3 montre trois tableaux récapitulatifs de données de haut niveau qui suivent le résumé du tableau.
Figure 3. Affiche trois tableaux récapitulatifs de données de haut niveau après le résumé du tableau
Le tableau Analyse de la variance montre comment les écarts des valeurs Y peuvent être attribués aux deux principales sources d'écart, la variance expliquée par le modèle (voir la ligne Modèle) et la variance non expliquée par le modèle (voir la ligne Erreur). Une valeur F élevée signifie que le modèle linéaire capture la majeure partie de l’écart dans les mesures Y. Ce tableau est plus utile dans un environnement de régression multiple, où chaque variable indépendante possède une ligne dans le tableau.
Le tableau Estimations des paramètres affiche l'origine estimée de l'axe Y (Interception) et la pente (Slope). Chaque ligne contient une valeur T et la probabilité d'observer la valeur T extrême (voir la colonne Prob > T). Prob > T pour pente peut être utilisé pour rejeter un modèle linéaire.
Si la probabilité de la valeur T est supérieure à 0,05 (ou une probabilité tout aussi faible), vous pouvez alors rejeter l'hypothèse nulle car la probabilité d'observer aléatoirement la valeur extrême est faible. Sinon, vous devez utiliser l'hypothèse nulle.
Dans les études de pertes dues au feu, la probabilité d’obtenir aléatoirement une valeur T de taille 12,57 est inférieure à 0,00000. Cela signifie que le modèle linéaire est un prédicteur utile (meilleur que la moyenne des valeurs Y ) des valeurs Y qui correspondent à la plage de valeurs X observée dans cette étude.
Le rapport final montre le coefficient de corrélation ou valeur R. Ils peuvent être utilisés pour évaluer dans quelle mesure un modèle linéaire s’adapte aux données. Une valeur R élevée indique un bon accord.
Chaque rapport de synthèse fournit des réponses à diverses questions analytiques sur la relation entre le modèle linéaire et les données. Consultez un manuel de Hamilton, Neter ou Pedhauzeur pour des traitements plus avancés de l'analyse de régression.
Les éléments finaux du rapport à afficher sont le diagramme de distribution et le graphique linéaire des données, comme le montre la figure 4.
Figure 4. Éléments du rapport final : diagramme de distribution et graphique linéaire
La plupart des gens connaissent la description des graphiques linéaires (comme le premier graphique de cette série), je ne ferai donc aucun commentaire à ce sujet, sauf pour dire que la bibliothèque JPGraph peut produire des graphiques scientifiques de haute qualité pour le Web. Il fait également un excellent travail lorsque vous saisissez des données de distribution ou de ligne droite.
Le deuxième tracé relie les résidus (observés Y , prédits Y ) à vos valeurs Y prédites. Il s'agit d'un exemple de graphique utilisé par les partisans de l'analyse exploratoire des données (EDA) pour aider à maximiser la capacité des analystes à détecter et à comprendre les modèles dans les données. Les experts peuvent utiliser ce diagramme pour répondre à des questions sur :
Cet outil d'étude de données peut être facilement étendu pour produire plus de types de graphiques — Histogrammes, boîte tracés et tracés quartiles – ce sont des outils EDA standard.
Architecture de la bibliothèque mathématique
Mon passe-temps pour les mathématiques m'a permis de m'intéresser aux bibliothèques de mathématiques ces derniers mois. Des recherches comme celle-ci me poussent à réfléchir à la manière d'organiser ma base de code et d'anticiper la croissance future.
Je vais utiliser la structure de répertoires du listing 5 pour l'instant :
Listing 5. Structure de répertoire facile à développer
phpmath/ burnout_study.php explorer.php fire_study.php barre de navigation.php dist/ Distribution.php pêcheur.php étudiant.php source.php jpg/ etc... reflex/ SimpleLinearRegression.php SimpleLinearRegressionHTML.php température/ |
À l'avenir, la définition de la variable PHP_MATH se fera via un fichier de configuration pour l'ensemble de la bibliothèque mathématique PHP.
Qu'avez-vous appris ?
Dans cet article, vous avez appris à utiliser la classe SimpleLinearRegression pour développer des outils de recherche de données pour des ensembles de données de petite à moyenne taille. En cours de route, j'ai également développé une fonction de probabilité native à utiliser avec la classe SimpleLinearRegression et étendu la classe avec des méthodes de sortie HTML et un code de génération de graphiques basé sur la bibliothèque JpGraph.
Du point de vue de l’apprentissage, la modélisation de régression linéaire simple mérite une étude plus approfondie, car elle s’est avérée être le seul moyen de comprendre des formes plus avancées de modélisation statistique. Vous bénéficierez d'une solide compréhension de la régression linéaire simple avant de vous plonger dans des techniques plus avancées telles que la régression multiple ou l'analyse de variance multivariée.
Même si la régression linéaire simple n’utilise qu’une seule variable pour expliquer ou prédire l’écart d’une autre variable, la recherche de relations linéaires simples entre toutes les variables étudiées reste souvent la première étape de l’analyse des données de recherche. Ce n’est pas parce que les données sont multivariées qu’elles doivent être étudiées à l’aide d’outils multivariés. En fait, commencer avec un outil de base comme la régression linéaire simple est un excellent moyen de commencer à explorer des modèles dans vos données.