Como prequel para uma pergunta sobre modelos lineares mistos em R, e para compartilhar como referência para os aficionados por estatísticas iniciantes / intermediárias, decidi publicar como um "estilo de perguntas e respostas" independente as etapas envolvidas no cálculo "manual" do coeficientes e valores previstos de uma regressão linear simples.
O exemplo é com o conjunto de dados R embutido mtcars
, e seria configurado como milhas por galão consumido por um veículo atuando como variável independente, regredido sobre o peso do carro (variável contínua) e o número de cilindros como um fator com três níveis (4, 6 ou 8) sem interações.
EDIT: Se você está interessado nesta pergunta, você definitivamente encontrará uma resposta detalhada e satisfatória neste post por Matthew Drury fora da CV .
fonte
Respostas:
Nota : Publiquei uma versão expandida desta resposta no meu site .
Certo! Abaixo a toca do coelho nós vamos.
A primeira camada é
lm
a interface exposta ao programador R. Você pode procurar a fonte disso apenas digitandolm
no console R. A maior parte (como a maioria da maioria dos códigos de nível de produção) é ocupada na verificação de entradas, na configuração de atributos de objetos e no lançamento de erros; mas essa linha se destacalm.fit
é outra função R, você pode chamá-lo você mesmo. Emboralm
trabalhe convenientemente com fórmulas e quadro de dados,lm.fit
deseja matrizes, então esse é um nível de abstração removido. Verificando a fontelm.fit
, mais trabalho ocupado e a seguinte linha realmente interessanteAgora estamos chegando a algum lugar.
.Call
é a maneira de R chamar o código C. Existe uma função C, C_Cdqrls na fonte R em algum lugar, e precisamos encontrá-la. Aqui está .Olhando para a função C, novamente, encontramos principalmente verificação de limites, limpeza de erros e trabalho ocupado. Mas essa linha é diferente
Então agora estamos no nosso terceiro idioma, R chamou C, que está chamando para o fortran. Aqui está o código fortran .
O primeiro comentário diz tudo
(curiosamente, parece que o nome dessa rotina foi alterado em algum momento, mas alguém se esqueceu de atualizar o comentário). Então, finalmente chegamos ao ponto em que podemos fazer álgebra linear e resolver o sistema de equações. É nesse tipo de coisa que o fortran é realmente bom, o que explica por que passamos por tantas camadas para chegar até aqui.
O comentário também explica o que o código fará
A primeira coisa que acontece, e de longe a mais importante, é
Isso chama a função fortran
dqrdc2
em nossa matriz de entradax
. O que é isso?Finalmente chegamos ao linpack . O Linpack é uma biblioteca de álgebra linear fortran que existe desde os anos 70. A álgebra linear mais séria acaba chegando ao linpack. No nosso caso, estamos usando a função dqrdc2
muito facilmente. De fato
então todo o sistema se torna
constant * beta_n = constant
fonte
Os cálculos passo a passo reais em R são belamente descritos na resposta de Matthew Drury neste mesmo tópico. Nesta resposta, quero percorrer o processo de provar a si mesmo que os resultados em R com um exemplo simples podem ser alcançados seguindo a álgebra linear de projeções no espaço da coluna e o conceito de erros perpendiculares (produtos pontuais), ilustrados em postagens diferentes , e bem explicado pelo Dr. Strang em Álgebra linear e suas aplicações , e facilmente acessível aqui .
lm
A idêntico:
coef(lm(mpg ~ wt + as.factor(cyl)-1))
.y_hat <- HAT %*% mpg
cyl <- as.factor(cyl); OLS <- lm(mpg ~ wt + cyl); predict(OLS)
:fonte
beta = solve(t(X) %*% X, t(X) %*% y)
é, na prática, mais preciso do quesolve(t(X) %*% X) %*% t(X) %*% y
.R
cálculos importantes, gostaria de sugerir que você considere transformá-lo em uma contribuição para o nosso blog.