如何在R中的函数lm中使用权重?


21

谁能提供一些有关如何weights在R lm函数中使用参数的指针?举例来说,假设您要针对交通数据拟合模型,并且有数百行,每个行代表一个城市(人口不同)。如果您希望模型根据人口规模来调整每个观测值的相对影响,您是否可以简单指定weights=[the column containing the city's population]?那是可以进入的向量weights吗?还是您需要完全使用其他R函数/包/方法?

好奇地听到人们如何解决这个问题-在我在那里看到的任何线性建模教程中都没有看到它。谢谢!

Answers:


17

我认为R帮助页面的lm答案很好。对权重的唯一要求是提供的向量必须与数据长度相同。您甚至可以只提供数据集中变量的名称,R负责其余部分,NA管理等。您还可以在weight参数中使用公式。这是示例:

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))

请注意,权重必须为正,否则R将产生错误。


但是权重是否必须加一?lm如果按比例缩放与不按比例缩放,我在摘要中会得到不同的结果...
Palace Chan

不,权重不必总和为一。lm摘要中有什么不同?系数还是标准误差?
mpiktas

残差及其标准误差不同,但系数及其误差没有差异。
宫陈

3

您的建议应该可行。看看这是否有意义:

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))

通过为一个观测值提供相对于其他两个观测值的权重相对两倍的权重,第二行产生与第三行相同的截距和斜率(与第一行的结果不同),类似于复制第三观测值的影响。


我尝试了一下,但是发现summary第二行和第三行的输出是不同的,尤其是对于系数的p值,我想知道如果2条语句引用相同的数据集会发生这种情况。我在stackoverflow.com/questions/10268689/weighted-regression-in-r中
lokheart 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.