Quero fazer uma regressão linear em R usando a lm()
função. Meus dados são uma série temporal anual com um campo para o ano (22 anos) e outro para o estado (50 estados). Quero ajustar uma regressão para cada estado de modo que, no final, tenha um vetor de respostas de filme. Posso imaginar fazer o loop for para cada estado e depois fazer a regressão dentro do loop e adicionar os resultados de cada regressão a um vetor. Isso não parece muito com R, no entanto. No SAS eu faria uma instrução 'por' e no SQL faria um 'agrupar por'. Qual é a maneira R de fazer isso?
r
regression
linear-regression
lm
JD Long
fonte
fonte
aggregate
não é certo ; nem étapply
.Respostas:
Aqui está uma maneira de usar o
lme4
pacote.fonte
Esta é uma abordagem usando o pacote plyr :
fonte
layout(matrix(c(1,2,3,4),2,2)) # optional 4 graphs/page
el_ply(models, plot)
obter cada um dos gráficos residuais também. É possível rotular cada uma das parcelas com o grupo (por exemplo, "estado" neste caso)?Desde 2009,
dplyr
foi lançado, o que realmente fornece uma maneira muito boa de fazer esse tipo de agrupamento, muito parecido com o que o SAS faz.Para recuperar os coeficientes e Rsquared / p.value, pode-se usar o
broom
pacote. Este pacote oferece:fonte
rowwise(fitted_models) %>% tidy(model)
para fazer o pacote de vassouras funcionar, mas fora isso, ótima resposta.d %>% group_by(state) %>% do(model = lm(response ~ year, data = .)) %>% rowwise() %>% tidy(model)
Na minha opinião, um modelo linear misto é uma abordagem melhor para este tipo de dados. O código abaixo é dado no efeito fixo da tendência geral. Os efeitos aleatórios indicam como a tendência de cada estado individual difere da tendência global. A estrutura de correlação leva em consideração a autocorrelação temporal. Dê uma olhada na Pinheiro & Bates (Modelos de Efeitos Mistos em S e S-Plus).
fonte
Uma boa solução usando
data.table
foi postada aqui no CrossValidated por @Zach. Eu apenas acrescentaria que é possível obter iterativamente também o coeficiente de regressão r ^ 2:bem como todas as outras saídas de
summary(lm)
:fonte
Acho que vale a pena adicionar uma
purrr::map
abordagem para esse problema.Veja a resposta de @Paul Hiemstra para mais ideias sobre como usar o
broom
pacote com esses resultados.fonte
fonte
Agora minha resposta chega um pouco tarde, mas eu estava procurando uma funcionalidade semelhante. Parece que a função embutida 'por' em R também pode fazer o agrupamento facilmente:
? by contém o seguinte exemplo, que se ajusta por grupo e extrai os coeficientes com sapply:
fonte
A
lm()
função acima é um exemplo simples. A propósito, imagino que seu banco de dados tenha as colunas da seguinte forma:ano estado var1 var2 y ...
No meu ponto de vista, você pode usar o seguinte código:
fonte
A questão parece ser como chamar funções de regressão com fórmulas que são modificadas dentro de um loop.
Aqui está como você pode fazer isso (usando o conjunto de dados de diamantes):
fonte