Como usar pesos na função lm em R?


21

Alguém poderia oferecer algumas dicas sobre como usar o weightsargumento na lmfunção de R ? Digamos, por exemplo, você estava tentando ajustar um modelo nos dados de tráfego e tinha várias centenas de linhas, cada uma representando uma cidade (com uma população diferente). Se você quisesse que o modelo ajustasse a influência relativa de cada observação com base no tamanho da população, você poderia simplesmente especificar weights=[the column containing the city's population]? É esse o tipo de vetor que pode ser inserido weights? Ou você precisaria usar uma função / pacote / abordagem R completamente diferente?

Curioso para saber como as pessoas lidam com este - não o vi coberto em nenhum dos tutoriais de modelagem linear que vi por aí. Obrigado!

Respostas:


17

Acho que a página de ajuda da R lmresponde bem à sua pergunta. O único requisito para pesos é que o vetor fornecido tenha o mesmo comprimento que os dados. Você pode até fornecer apenas o nome da variável no conjunto de dados, R cuidará do resto, gerenciamento de NA etc. Você também pode usar fórmulas no weightargumento. Aqui está o exemplo:

x <-c(rnorm(10),NA)
df <- data.frame(y=1+2*x+rnorm(11)/2, x=x, wght1=1:11)

## Fancy weights as numeric vector
summary(lm(y~x,data=df,weights=(df$wght1)^(3/4))) 

# Fancy weights as formula on column of the data set
summary(lm(y~x,data=df,weights=I(wght1^(3/4))))

# Mundane weights as the column of the data set
summary(lm(y~x,data=df,weights=wght1))

Observe que os pesos devem ser positivos, caso contrário R produzirá um erro.


mas os pesos precisam somar um? Eu obter resultados diferentes no meu lmresumo, se eles são escalados vs não ...
— Palácio Chan

Não, os pesos não precisam somar um. O que é diferente no lmresumo? Os coeficientes ou os erros padrão?
— mpiktas

Os resíduos e seus erros padrão diferem, mas os coeficientes e seus erros não.
— Palace Chan

3

O que você sugere deve funcionar. Veja se isso faz sentido:

lm(c(8000, 50000, 116000) ~ c(6, 7, 8))
lm(c(8000, 50000, 116000) ~ c(6, 7, 8), weight = c(123, 123, 246))
lm(c(8000, 50000, 116000, 116000) ~ c(6, 7, 8, 8))

A segunda linha produz o mesmo intercepto e inclinação que a terceira linha (distinta do resultado da primeira linha), fornecendo uma observação relativamente duas vezes o peso de cada uma das outras duas observações, semelhante ao impacto de duplicar a terceira observação.


Eu tentei isso, mas achei que a summarysaída é diferente para a segunda e a terceira linha, especialmente para o valor p do coeficiente, imagino que isso acontecerá se as duas instruções se referirem ao mesmo conjunto de dados. Eu postei uma pergunta sobre isso em stackoverflow.com/questions/10268689/weighted-regression-in-r
— lokheart
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.