Correlación y regresión con PHP.
Resumen.
En este artículo vamos a presentar una función para realizar cálculos estadísticos, que si bien no es el cálculo de “todos los días”, sí nos lo encontramos prácticamente en cualquier disciplina técnica, desde la medicina, psicología o biología, hasta las diferentes ingenierías. Se trata de los cálculos más básicos del Modelo Lineal General, y sus coeficientes claves, la correlación de Pearson y la pendiente y ordenada de la ecuación de regresión simple.Artículo.
Este artículo viene a presentar una solución de cálculo bastante común en muchas disciplinas, no obstante, es posible que a muchos lectores los conceptos de correlación y regresión le suenen a “chino mandarín”. Si este es tu caso y te interesa este asunto, puedes buscar en Google por “correlación de Pearson”.
Dicho esto, haremos una breve introducción a los conceptos mencionados. La correlación es una forma de medir la relación entre dos variables. Por ejemplo, podemos determinar si el número de horas semanales trabajadas guarda una relación real con el salario. O también podemos determinar qué dosis de un fármaco produce una cierta mejora en la sintomatología de una cierta patología.
Este uso en PHP va a estar íntimamente relacionado con la naturaleza temática del sitio Web en que estemos trabajando, pero, además, en otro artículo presentaremos un uso de este modelo matemático para determinar si un texto es realmente un texto con significado o simplemente un conjunto de caracteres resultante de pulsar el teclado aleatoriamente. Así que, como hemos dicho, ahora vamos a dedicarnos al cálculo de estos coeficientes.
Todo aquel que ha calculado mediante una calculadora básica la correlación de Pearson se habrá dado cuenta de la gran cantidad de operaciones que hay que realizar. Y precisamente esto, a PHP se le da muy bien.
Para quien esté familiarizado con la terminología estadística, ofrecemos aquí la formula del coeficiente de correlación de Pearson.
Pues bien, esta es una de las formulas que vamos a calcular, pero no solo esta, también calcularemos la pendiente con una fórmula parecida a esta, y la ordenada con una formula bastante mas simple.
También se calculan otros coeficientes relacionados con la medición psicológica desde la denominada Teoría Clásica de los Test, ni que decir tiene, que aunque los dejo en la función, a muy pocas personas le resultaran útiles estos coeficientes, a menos que sea un psicometra o tenga que realizar algún proyecto sobre esta materia.
Por tanto, nuestra función, por motivos obvios, va a devolver un array, del cual las keys 0 a 4 serán las más usuales, que son los coeficientes más elementales del Modelo Lineal General.
No vamos a explicar el desarrollo de la función ya que puede resultar un tanto pesado, pero sí diremos que para calcular estos coeficientes es preciso el cálculo de varios sumatorios, lo cual lo hemos realizado con el bucle foreach, y ciertas fórmulas las hemos dividido en partes para facilitar su programación, al igual que la comprensión de esta programación si se esta familiarizado con estos coeficientes.
Sin más, la función es la siguiente:
El valor de coeficiente de correlación de Pearson esta comprendido entre -1 y 1, donde sendos valores marcan una relación perfecta entre variables negativa o positiva perfecta, y el valor 0 indica ausencia total de relación.
Íntimamente relacionado con este, está el coeficiente de determinación, que nos da el porcentaje de variación que puede ser explicado por la ecuación de regresión. Lógicamente, debemos multiplicarlo por 100 para tenerlo en forma de porcentaje.
La ecuación de regresión toma la forma Y = aX+b, donde “a” es la pendiente y “b” la ordenada. A partir de ella podemos hacer estimaciones de los valores de Y en función de los valores de X.
No quiero dejar de mencionar que para el cálculo de la correlación de Pearson PHP tiene una función, stats_stat_correlation(), pero esta función no entra en la instalación general de PHP y se hace precisa la biblioteca de cálculo estadístico. Si tienes especial interés en este asunto, y precisas de más funciones estadísticas, probablemente sea el momento para instalarla en tu servidor.
Espero que este artículo os haya gustado e igualmente espero no haberos saturado con la tecnoverborrea.
Dicho esto, haremos una breve introducción a los conceptos mencionados. La correlación es una forma de medir la relación entre dos variables. Por ejemplo, podemos determinar si el número de horas semanales trabajadas guarda una relación real con el salario. O también podemos determinar qué dosis de un fármaco produce una cierta mejora en la sintomatología de una cierta patología.
Este uso en PHP va a estar íntimamente relacionado con la naturaleza temática del sitio Web en que estemos trabajando, pero, además, en otro artículo presentaremos un uso de este modelo matemático para determinar si un texto es realmente un texto con significado o simplemente un conjunto de caracteres resultante de pulsar el teclado aleatoriamente. Así que, como hemos dicho, ahora vamos a dedicarnos al cálculo de estos coeficientes.
Todo aquel que ha calculado mediante una calculadora básica la correlación de Pearson se habrá dado cuenta de la gran cantidad de operaciones que hay que realizar. Y precisamente esto, a PHP se le da muy bien.
Para quien esté familiarizado con la terminología estadística, ofrecemos aquí la formula del coeficiente de correlación de Pearson.
Pues bien, esta es una de las formulas que vamos a calcular, pero no solo esta, también calcularemos la pendiente con una fórmula parecida a esta, y la ordenada con una formula bastante mas simple.
También se calculan otros coeficientes relacionados con la medición psicológica desde la denominada Teoría Clásica de los Test, ni que decir tiene, que aunque los dejo en la función, a muy pocas personas le resultaran útiles estos coeficientes, a menos que sea un psicometra o tenga que realizar algún proyecto sobre esta materia.
Por tanto, nuestra función, por motivos obvios, va a devolver un array, del cual las keys 0 a 4 serán las más usuales, que son los coeficientes más elementales del Modelo Lineal General.
No vamos a explicar el desarrollo de la función ya que puede resultar un tanto pesado, pero sí diremos que para calcular estos coeficientes es preciso el cálculo de varios sumatorios, lo cual lo hemos realizado con el bucle foreach, y ciertas fórmulas las hemos dividido en partes para facilitar su programación, al igual que la comprensión de esta programación si se esta familiarizado con estos coeficientes.
Sin más, la función es la siguiente:
La función recibe como entrada 3 parámetros, de los cuales, dos son tipo array (cada una de las dos muestras) y un tercero que es el número de decimales que queremos de precisión.<?php // Correlacion de Pearson, regresion y otros coeficientes /* Funcion desarrollada por ArtesaniaWeb.Es Mas info en: https://www.artesaniaweb.es/articulo.php?titulo=correlacion_y_regresion_con_php-mpsee */ function Pearson($muestra_x,$muestra_y,$decimales){ $n_x = count($muestra_x); // Tamaño $n_y = count($muestra_y); // Tamaño if($n_x == $n_y){ $suma_x = array_sum($muestra_x); // Sumatorio $cuadrado_suma_x = pow($suma_x, 2); // Cuadrado del sumatorio $media_x = $suma_x / $n_x; // Media foreach ($muestra_x as $key => $valor_x){ $muestr_x2[$key] = pow($valor_x, 2); // Creamos el nuevo array } $suma_x_cuadra = array_sum($muestr_x2); $suma_y = array_sum($muestra_y); // Sumatorio $cuadrado_suma_y = pow($suma_y, 2); // Cuadrado del sumatorio $media_y = $suma_y / $n_y; // Media foreach ($muestra_y as $key => $valor_y){ $muestr_y2[$key] = pow($valor_y, 2); // Creamos el nuevo array } $suma_y_cuadra = array_sum($muestr_y2); foreach($muestra_x as $key => $datos){ $muestr_xy[$key] = $datos * $muestra_y[$key]; // Sumatorio de X*Y } $suma_producto = array_sum($muestr_xy); $n_x = $n_x; // --------------------------------- Calculamos el coeficiente de correlacion de Pearson y su determinacion $numerador_correl = ($n_x*$suma_producto)-($suma_x*$suma_y); $denomin1_correl = sqrt(($n_x*$suma_x_cuadra)-$cuadrado_suma_x); $denomin2_correl = sqrt(($n_x*$suma_y_cuadra)-$cuadrado_suma_y); $corel_pearson = $numerador_correl/($denomin1_correl*$denomin2_correl); // Es la correlacion - fiabilidad $corel_pearson_rd = round($corel_pearson,$decimales); $corel_determinacion_rd = round(pow($corel_pearson, 2),$decimales); // --------------------------------- Calculamos pendiente y ordenada // Caculamos la pendiente $beta = ($n_x*$suma_producto - $suma_x*$suma_y)/($n_x*$suma_x_cuadra - $cuadrado_suma_x); $beta_rd = round($beta,$decimales); // Calculamos la ordenada $ordenada = $media_y - ($beta*$media_x); $ordenada_rd = round($ordenada,$decimales); // --------------------------------- Calculamos otros indices $coef_fiabilidad = abs($corel_pearson); // Es el valor absoluto de la fiabilidad o correlación de Pearson $coef_fiabilidad_rd = round($coef_fiabilidad,$decimales); $indice_fiabilidad = sqrt($coef_fiabilidad); // Es el indice de fiabilidad $indice_fiabilidad_rd = round($indice_fiabilidad,$decimales); // Validez -- Tomamos como validez el punto medio entre el coeficiente y el indice de fiabilidad $coef_validez = ($coef_fiabilidad + $indice_fiabilidad) / 2; $coef_validez_rd = round($coef_validez,$decimales); $coef_determinacion = pow($coef_validez,2); $coef_determinacion_rd = round($coef_determinacion,$decimales); $coef_alineacion = sqrt(1 - $coef_determinacion); $coef_alineacion_rd = round($coef_alineacion,$decimales); $coef_vpredictivo = 1 - $coef_alineacion; $coef_vpredictivo_rd = round($coef_vpredictivo,$decimales); $Reg_Lineal = array($n_x,$corel_pearson_rd,$corel_determinacion_rd,$beta_rd,$ordenada_rd,$coef_fiabilidad_rd,$indice_fiabilidad_rd,$coef_validez_rd,$coef_determinacion_rd,$coef_alineacion_rd,$coef_vpredictivo_rd); }else{ $Reg_Lineal = array('Las dos muestras deben tener el mismo tamaño.'); } return $Reg_Lineal; } // Ejecutamos la funcion $muestra_x = array(6,5,3,2,1,4,8,5,5,4); // 6,5,3,2,1,4,8,5,5,4 $muestra_y = array(7,8,5,4,3,7,10,7,8,7); // 7,8,5,4,3,7,10,7,8,7 $decimales = 4; $regresion = Pearson($muestra_x,$muestra_y,$decimales); echo '<pre>'; print_r($regresion); echo '</pre>'; if(count($muestra_x) == count($muestra_y)){ $en_porcentaje = round($regresion[2] * 100, 2); echo "<p><b>Modelo lineal general.</b> <br /> N = $regresion[0] <br /> Coeficiente de correlacion de Pearson = $regresion[1] <br /> Coeficiente de determinación de Pearson = $regresion[2] | $en_porcentaje %<br /> Pendiente ecuacion de regresion = $regresion[3] <br /> Ordenada ecuacion de regresion = $regresion[4] <br /> <hr> <b>En la Teoria Clasica de los Test.</b><br /> Coeficiente de fiabilidad = $regresion[5] <br /> Indice de fiabilidad = $regresion[6] <br /> Coeficiente de validez ≈ $regresion[7] <br /> Coeficiente de determinacion = $regresion[8] <br /> Coeficiente de alineacion = $regresion[9] <br /> Coeficiente de valor predictivo = $regresion[10] </p>"; }else{ echo "<p>$regresion[0]</p>"; } ?>
El valor de coeficiente de correlación de Pearson esta comprendido entre -1 y 1, donde sendos valores marcan una relación perfecta entre variables negativa o positiva perfecta, y el valor 0 indica ausencia total de relación.
Íntimamente relacionado con este, está el coeficiente de determinación, que nos da el porcentaje de variación que puede ser explicado por la ecuación de regresión. Lógicamente, debemos multiplicarlo por 100 para tenerlo en forma de porcentaje.
La ecuación de regresión toma la forma Y = aX+b, donde “a” es la pendiente y “b” la ordenada. A partir de ella podemos hacer estimaciones de los valores de Y en función de los valores de X.
No quiero dejar de mencionar que para el cálculo de la correlación de Pearson PHP tiene una función, stats_stat_correlation(), pero esta función no entra en la instalación general de PHP y se hace precisa la biblioteca de cálculo estadístico. Si tienes especial interés en este asunto, y precisas de más funciones estadísticas, probablemente sea el momento para instalarla en tu servidor.
Espero que este artículo os haya gustado e igualmente espero no haberos saturado con la tecnoverborrea.
Tags: Estadística || correlación || Pearson || regresión