O objetivo básico por trás da
modelagem de regressão linearconceitualmente
simples é encontrar a melhor linha reta de um plano bidimensional que consiste em pares de valores X e Y (ou seja, medidas de X e Y).Uma vez encontrada a linha usando o método de variância mínima, vários testes estatísticos podem ser realizados para determinar quão bem a linha se ajusta ao desvio observado do valor Y.
A equação linear (y = mx + b) possui dois parâmetros que devem ser estimados a partir dos dados X e Y fornecidos, são eles a inclinação (m) e a interceptação y (b). Uma vez estimados esses dois parâmetros, você pode inserir os valores observados na equação linear e observar as previsões Y geradas pela equação.
Para estimar os parâmetros m e b usando o método de variância mínima, precisamos encontrar os valores estimados de m e b que minimizem os valores observados e previstos de Y para todos os valores de X. A diferença entre os valores observados e previstos é chamada de erro ( y i- (mx i+ b) ), e se você elevar ao quadrado cada valor de erro e depois somar esses resíduos, o resultado será um número ruim ao quadrado da previsão. Usar o método de variância mínima para determinar o melhor ajuste envolve encontrar estimativas de m e b que minimizem a variância da previsão.
Dois métodos básicos podem ser usados para encontrar as estimativas m e b que satisfazem o método de variância mínima. Na primeira abordagem, pode-se usar um processo de busca numérica para definir diferentes valores de m e b e avaliá-los, decidindo em última análise sobre a estimativa que produz a variância mínima. O segundo método é usar cálculo para encontrar equações para estimar m e b. Não vou entrar no cálculo envolvido na derivação dessas equações, mas usei essas equações analíticas na classe SimpleLinearRegression para encontrar estimativas de mínimos quadrados de m e b (consulte getSlope() e getYIntercept no método da classe SimpleLinearRegression).
Mesmo que você tenha equações que possam ser usadas para encontrar estimativas de mínimos quadrados de m e b, isso não significa que, se você inserir esses parâmetros em uma equação linear, o resultado será uma linha reta que se ajusta bem aos dados. A próxima etapa neste processo de regressão linear simples é determinar se a variância de previsão restante é aceitável.
Você pode usar um processo de decisão estatística para rejeitar a hipótese alternativa de que a linha reta se ajusta aos dados. Este processo é baseado no cálculo da estatística T, utilizando uma função de probabilidade para encontrar a probabilidade de uma observação aleatoriamente grande. Conforme mencionado na Parte 1, a classe SimpleLinearRegression gera uma série de valores resumidos, um dos valores resumidos importantes é a estatística T, que pode ser usada para medir quão bem a equação linear se ajusta aos dados. Se o ajuste for bom, a estatística T tenderá a ser um valor grande; se o valor de T for pequeno, você deve substituir sua equação linear por um modelo padrão que assume que a média dos valores de Y é o melhor preditor ( Porque a média de um conjunto de valores muitas vezes pode ser um preditor útil da próxima observação).
Para testar se a estatística T é grande o suficiente para não usar o valor médio de Y como o melhor preditor, é necessário calcular a probabilidade de obter a estatística T aleatoriamente. Se a probabilidade for baixa, então a suposição nula de que a média é o melhor preditor pode ser dispensada e, consequentemente, pode-se ter certeza de que um modelo linear simples é um bom ajuste aos dados. (Veja a Parte 1 para obter mais informações sobre como calcular a probabilidade de uma estatística T.)
Retorne ao processo de tomada de decisão estatística. Diz quando não adotar a hipótese nula, mas não diz se deve aceitar a hipótese alternativa. Em um ambiente de pesquisa, hipóteses alternativas de modelos lineares precisam ser estabelecidas por meio de parâmetros teóricos e estatísticos.
A ferramenta de pesquisa de dados que você construirá implementa um processo de tomada de decisão estatística para modelos lineares (testes T) e fornece dados resumidos que podem ser usados para construir os parâmetros teóricos e estatísticos necessários para construir modelos lineares. As ferramentas de pesquisa de dados podem ser classificadas como ferramentas de apoio à decisão para que os trabalhadores do conhecimento estudem padrões em conjuntos de dados de pequeno e médio porte.
Do ponto de vista do aprendizado, vale a pena estudar a modelagem de regressão linear simples, pois é a única maneira de compreender formas mais avançadas de modelagem estatística. Por exemplo, muitos conceitos básicos da regressão linear simples estabelecem uma boa base para a compreensão da regressão múltipla (regressão múltipla), análise fatorial (análise fatorial) e séries temporais (séries temporais).
A regressão linear simples também é uma técnica de modelagem versátil. Ele pode ser usado para modelar dados curvilíneos transformando os dados brutos (geralmente com uma transformação logarítmica ou de potência). Essas transformações linearizam os dados para que possam ser modelados por meio de regressão linear simples. O modelo linear resultante será representado como uma fórmula linear relacionada aos valores transformados.
Função de probabilidade
No artigo anterior, evitei o problema de implementar a função de probabilidade em PHP pedindo a R para encontrar o valor da probabilidade. Não fiquei totalmente satisfeito com esta solução, então comecei a pesquisar a questão: o que é necessário para desenvolver funções de probabilidade baseadas em PHP.
Comecei a procurar informações e códigos on-line. Uma fonte para ambos é o livro Receitas Numéricas em C. Funções de Probabilidade. Reimplementei alguns códigos de função de probabilidade (funções gammln.c e betai.c) em PHP, mas ainda não estou satisfeito com os resultados. Parece ter um pouco mais de código do que algumas outras implementações. Além disso, preciso da função de probabilidade inversa.
Felizmente, me deparei com o Cálculo Estatístico Interativo de John Pezzullo. O site do John sobre funções de distribuição de probabilidade tem todas as funções que preciso, implementadas em JavaScript para facilitar o aprendizado.
Portei as funções Student T e Fisher F para PHP. Mudei um pouco a API para estar em conformidade com o estilo de nomenclatura Java e incorporei todas as funções em uma classe chamada Distribution. Um grande recurso desta implementação é o método doCommonMath, que é reutilizado por todas as funções desta biblioteca. Outros testes que não me preocupei em implementar (teste de normalidade e teste qui-quadrado) também usam o método doCommonMath.
Outro aspecto deste transplante também merece destaque. Ao usar JavaScript, os usuários podem atribuir valores determinados dinamicamente a variáveis de instância, como:
var PiD2 = pi() / 2
Você não pode fazer isso em PHP. Apenas valores constantes simples podem ser atribuídos a variáveis de instância. Esperamos que esta falha seja resolvida no PHP5.
Observe que o código na Listagem 1 não define variáveis de instância — isso ocorre porque na versão JavaScript, elas são valores atribuídos dinamicamente.
Listagem 1. Implementando a função de probabilidade
<?php
// Distribution.php
// Direitos autorais John Pezullo
// Lançado sob os mesmos termos do PHP.
// Porta PHP e OO'fying por Paul Meagher
class Distribution {
function doCommonMath($q, $i, $j, $b) {
$zz = 1;
$z = $zz;
$k = $i;
enquanto($k <= $j) {
$zz = $zz * $q * $k / ($k - $b);
$z = $z + $zz;
$k = $k + 2;
}
retornar $z;
}
function getAlunoT($t, $df) {
$t = abs($t);
$w = $t / sqrt($df);
$th = atan($w);
se ($df == 1) {
return 1 - $th / (pi() / 2);
}
$sth = pecado($th);
$cth = cos($th);
if(($df % 2) ==1 ) {
retornar
1 - ($th + $sth * $cth * $this->doCommonMath($cth * $cth, 2, $df - 3, -1))
/ (pi()/2);
} outro {
return 1 - $sth * $this->doCommonMath($cth * $cth, 1, $df - 3, -1);
}
}
função getInverseStudentT($p, $df) {
$v = 0,5;
$dv = 0,5;
$ t = 0;
enquanto($dv > 1e-6) {
$t = (1 / $v) - 1;
$dv = $dv / 2;
if ($this->getStudentT($t, $df) > $p) {
$v = $v - $dv;
} outro {
$v = $v + $dv;
}
}
retornar $t;
}
function getFisherF($f, $n1, $n2) {
//implementado mas não mostrado
}
function getInverseFisherF($p, $n1, $n2) {
//implementado mas não mostrado
}
}
?>
Métodos de saída
Agora que você implementou a função de probabilidade em PHP, o único desafio restante no desenvolvimento de uma ferramenta de pesquisa de dados baseada em PHP é projetar um método para exibir os resultados da análise.
A solução simples é exibir os valores de todas as variáveis de instância na tela conforme necessário. No primeiro artigo, fiz exatamente isso ao mostrar a equação linear, o valor T e a probabilidade T para o Estudo de Burnout. É útil poder acessar valores específicos para fins específicos, e SimpleLinearRegression suporta esse uso.
Contudo, outro método para produzir resultados é agrupar sistematicamente partes da produção. Se você estudar os resultados dos principais pacotes de software estatístico usados para análise de regressão, descobrirá que eles tendem a agrupar seus resultados da mesma maneira. Eles geralmente incluem tabela de resumo, tabela de análise de variância, tabela de estimativa de parâmetros e valor R. Da mesma forma, criei alguns métodos de saída com os seguintes nomes:
showSummaryTable()
showAnalysisOfVariance()
showParameterEstimates()
mostrarValores()
Também tenho um método para exibir a fórmula de previsão linear ( getFormula() ). Muitos pacotes de software estatístico não geram fórmulas, mas esperam que o usuário construa fórmulas com base na saída dos métodos acima. Isso ocorre em parte porque a forma final da fórmula que você acaba usando para modelar seus dados pode diferir da fórmula padrão pelos seguintes motivos:
A interceptação Y pode não ter uma interpretação significativa ou os valores de entrada podem ter sido transformados de uma forma que você pode precisar desconversá-los para obter a explicação final.
Todos esses métodos assumem que o meio de saída é uma página da web. Considerando que você pode querer gerar esses valores de resumo em um meio diferente de uma página da web, decidi agrupar esses métodos de saída em uma classe que herda a classe SimpleLinearRegression. O código da Listagem 2 tem como objetivo demonstrar a lógica geral da classe de saída. Para tornar a lógica comum mais proeminente, o código que implementa vários métodos show foi removido.
Listagem 2. Demonstrando a lógica comum da classe de saída
<?php
// HTML.php
// Direitos autorais 2003, Paul Meagher
// Distribuído sob GPL
include_once "slr/SimpleLinearRegression.php";
class SimpleLinearRegressionHTML estende 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() {}
}
?>
O construtor desta classe é apenas um wrapper em torno do construtor da classe SimpleLinearRegression. Isso significa que se você quiser exibir a saída HTML de uma análise SimpleLinearRegression, deverá instanciar a classe SimpleLinearRegressionHTML em vez de instanciar diretamente a classe SimpleLinearRegression. A vantagem é que você não sobrecarregará a classe SimpleLinearRegression com muitos métodos não utilizados e poderá definir classes com mais liberdade para outras mídias de saída (talvez implementando a mesma API para diferentes tipos de mídia).
Saída gráficaOs
métodos de saída que você implementou até agora exibem valores resumidos em formato HTML. Também é adequado para exibir gráficos de dispersão ou gráficos de linhas desses dados em formato GIF, JPEG ou PNG.
Em vez de escrever eu mesmo o código para gerar gráficos de linhas e distribuição, pensei que seria melhor usar uma biblioteca gráfica baseada em PHP chamada JpGraph. O JpGraph está sendo desenvolvido ativamente por Johan Persson, cujo site do projeto o descreve desta forma:
Seja para gráficos "obtidos de maneira rápida, mas inadequada" com código mínimo, ou para gráficos profissionais complexos que exigem controle muito refinado, o JpGraph pode ser usado para desenhar eles se tornam fáceis. JpGraph é igualmente adequado para gráficos científicos e empresariais.
A distribuição JpGraph inclui vários scripts de amostra que podem ser personalizados para necessidades específicas. Usar o JpGraph como ferramenta de pesquisa de dados é tão simples quanto encontrar um script de amostra que faça algo semelhante ao que preciso e adaptá-lo para atender às minhas necessidades específicas.
O script na Listagem 3 é extraído da ferramenta de exploração de dados de amostra (explore.php) e demonstra como chamar a biblioteca e preencher as classes Line e Scatter com dados da análise SimpleLinearRegression. Os comentários neste código foram escritos por Johan Persson (a base de código JPGraph faz um bom trabalho ao documentá-lo).
Listagem 3. Detalhes de funções da ferramenta de exploração de dados de amostra explore.php
<?php
// Snippet extraído do script explore.php
include ("jpgraph/jpgraph.php");
incluir ("jpgraph/jpgraph_scatter.php");
include ("jpgraph/jpgraph_line.php");
// Cria o gráfico
$gráfico = novo Gráfico(300.200,'auto');
$graph->SetScale("linlin");
//Título da configuração
$gráfico->título->Set("$título");
$gráfico->img->SetMargin(50,20,20,40);
$graph->xaxis->SetTitle("$x_name","center");
$gráfico->yaxis->SetTitleMargin(30);
$graph->yaxis->title->Set("$y_name");
FF_FONT1
,FS_BOLD);
// na parte inferior do gráfico e não apenas em Y=0 que é
//a posição padrão
$graph->xaxis->SetPos('min');
// Cria o gráfico de dispersão com algumas cores legais
$sp1 = novo ScatterPlot($slr->Y, $slr->X);
$sp1->mark->SetType(MARK_FILLEDCIRCLE);
$sp1->marca->SetFillColor("vermelho");
$sp1->SetColor("azul");
$sp1->DefinirPeso(3);
$sp1->mark->SetWidth(4);
// Cria a linha de regressão
$lplot = new LinePlot($slr->PreditoY, $slr->X);
$lplot->SetWeight(2);
$lplot->SetColor('navy');
// Adiciona os pltos à linha
$gráfico->Adicionar($sp1);
$graph->Add($lplot);
// ... e traço
$graph_name = "temp/test.png";
$gráfico->Stroke($nome_gráfico);
?>
<img src='<?php echo $graph_name ?>' vspace='15'>
?>
Script de pesquisa de dados
A ferramenta de pesquisa de dados consiste em um único script (explore.php) que chama métodos da classe SimpleLinearRegressionHTML e da biblioteca JpGraph .
O script usa lógica de processamento simples. A primeira parte do script realiza a validação básica nos dados do formulário enviado. Se os dados deste formulário passarem na validação, a segunda parte do script será executada.
A segunda parte do script contém código que analisa os dados e exibe o resumo dos resultados em HTML e formatos gráficos. A estrutura básica do script explore.php é mostrada na Listagem 4:
Listagem 4. Estrutura do explore.php
<?php
// explore.php
if (!empty($x_values)) {
$X = explodir(",", $x_valores);
$numX = contagem($X);
}
if (!empty($y_values)) {
$Y = explodir(",", $y_values);
$numY = contagem($Y);
}
// exibe o formulário de entrada de dados de entrada se as variáveis não estiverem definidas
if ( (empty($title)) OR (empty($x_name)) OR (empty($x_values)) OR
(vazio($y_name)) OU (vazio($conf_int)) OU (vazio($y_valores)) OU
($numX != $numY) ) {
// Código omitido para exibição do formulário de entrada
} outro {
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>";
incluir ("jpgraph/jpgraph.php");
incluir ("jpgraph/jpgraph_scatter.php");
incluir ("jpgraph/jpgraph_line.php");
// O código para exibir os gráficos está embutido no
// script explore.php O código para esses gráficos de duas linhas.
// finaliza o script:
// Código omitido para exibir dispersão mais gráfico de linhas
// Código omitido para exibição do gráfico de resíduos
}
?>
Estudo de danos de fogo
Para demonstrar como usar ferramentas de pesquisa de dados, usarei dados de um estudo hipotético de danos por incêndio. Este estudo relaciona a quantidade de danos causados pelo incêndio nas principais áreas residenciais com a distância do corpo de bombeiros mais próximo. Por exemplo, as companhias de seguros estariam interessadas no estudo desta relação para efeitos de determinação dos prémios de seguro.
Os dados deste estudo são mostrados na tela de entrada da Figura 1.
Figura 1. Tela de entrada mostrando dados do estudo
Após o envio dos dados, eles são analisados e os resultados dessas análises são exibidos. O primeiro conjunto de resultados exibido é o Table Summary , conforme mostrado na Figura 2.
Figura 2. Resumo da tabela é o primeiro conjunto de resultados exibido
O Resumo da Tabela exibe os dados de entrada em formato tabular e colunas adicionais indicando o valor previsto Y correspondente ao valor observado
A Figura 3 mostra três tabelas de resumo de dados de alto nível após o Resumo da Tabela.
Figura 3. Mostra três tabelas de resumo de dados de alto nível após o Resumo da Tabela
A tabela Análise de Variância mostra como os desvios nos valores de Y podem ser atribuídos às duas principais fontes de desvio, variância explicada pelo modelo (consulte a linha Modelo) e variância não explicada pelo modelo (consulte a linha Erro). Um valor F grande significa que o modelo linear captura a maior parte do desvio nas medições Y. Esta tabela é mais útil em um ambiente de regressão múltipla, onde cada variável independente possui uma linha na tabela.
A tabela Estimativas de Parâmetros mostra a interceptação estimada do eixo Y (Intercept) e a inclinação (Slope). Cada linha contém um valor T e a probabilidade de observar o valor extremo de T (veja a coluna Prob > T). Prob > T para inclinação pode ser usado para rejeitar um modelo linear.
Se a probabilidade do valor T for maior que 0,05 (ou uma probabilidade igualmente pequena), então você pode rejeitar a hipótese nula porque a probabilidade de observar aleatoriamente o valor extremo é pequena. Caso contrário, você deve usar a hipótese nula.
Em estudos de perda por incêndio, a probabilidade de obter aleatoriamente um valor T de tamanho 12,57 é inferior a 0,00000. Isso significa que o modelo linear é um preditor útil (melhor que a média dos valores de Y ) dos valores de Y que correspondem ao intervalo de valores de X observado neste estudo.
O relatório final mostra o coeficiente de correlação ou valor R. Eles podem ser usados para avaliar quão bem um modelo linear se ajusta aos dados. Um valor alto de R indica boa concordância.
Cada relatório resumido fornece respostas a várias questões analíticas sobre a relação entre o modelo linear e os dados. Consulte um livro de Hamilton, Neter ou Pedhauzeur para tratamentos mais avançados de análise de regressão.
Os elementos finais do relatório a serem exibidos são o gráfico de distribuição e o gráfico de linhas dos dados, conforme mostrado na Figura 4.
Figura 4. Elementos do relatório final – gráfico de distribuição e gráfico de linhas
A maioria das pessoas está familiarizada com a descrição de gráficos de linha (como o primeiro gráfico desta série), então não comentarei sobre isso, exceto para dizer que a biblioteca JPGraph pode produzir gráficos científicos de alta qualidade para a Web. Ele também faz um ótimo trabalho quando você insere dados de distribuição ou de linha reta.
O segundo gráfico relaciona os resíduos ( Y observado, Y previsto) aos valores de Y previstos. Este é um exemplo de gráfico usado pelos defensores da Análise Exploratória de Dados (EDA) para ajudar a maximizar a capacidade dos analistas de detectar e compreender padrões nos dados. Os especialistas podem usar este diagrama para responder perguntas sobre:
Esta ferramenta de estudo de dados pode ser facilmente estendida para produzir mais tipos de gráficos — Histogramas, caixa gráficos e gráficos de quartis — são ferramentas EDA padrão.
Arquitetura da biblioteca matemática
Meu hobby pela matemática me manteve interessado em bibliotecas de matemática nos últimos meses. Pesquisas como essa me levam a pensar em como organizar minha base de código e antecipar o crescimento futuro.
Usarei a estrutura de diretórios da Listagem 5 por enquanto:
Listagem 5. Estrutura de diretório fácil de crescer
phpmath/ burnout_study.php explorar.php fire_study.php barra de navegação.php dist/ Distribuição.php pescador.php aluno.php fonte.php jpg/ etc... slr/ SimpleLinearRegression.php SimpleLinearRegressionHTML.php temperatura/ |
Futuramente, a configuração da variável PHP_MATH será feita através de um arquivo de configuração para toda a biblioteca matemática do PHP.
O que você aprendeu?
Neste artigo, você aprendeu como usar a classe SimpleLinearRegression para desenvolver ferramentas de pesquisa de dados para conjuntos de dados de pequeno e médio porte. Ao longo do caminho, também desenvolvi uma função de probabilidade nativa para uso com a classe SimpleLinearRegression e estendi a classe com métodos de saída HTML e código de geração de gráfico baseado na biblioteca JpGraph.
Do ponto de vista do aprendizado, a modelagem de regressão linear simples merece um estudo mais aprofundado, pois provou ser a única maneira de compreender formas mais avançadas de modelagem estatística. Você se beneficiará de um conhecimento sólido de regressão linear simples antes de mergulhar em técnicas mais avançadas, como regressão múltipla ou análise de variância multivariada.
Mesmo que a regressão linear simples utilize apenas uma variável para explicar ou prever o desvio de outra variável, encontrar relações lineares simples entre todas as variáveis do estudo ainda é frequentemente o primeiro passo na análise dos dados da investigação. Só porque os dados são multivariados não significa que devam ser estudados usando ferramentas multivariadas. Na verdade, começar com uma ferramenta básica como a regressão linear simples é uma ótima maneira de começar a explorar padrões em seus dados.