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!

Andrew
fonte

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.

mpiktas
fonte
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.

Henry
fonte
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