R 使用lm的样本权重时更正dfs
我试图弄清楚R 使用lm的样本权重时更正dfs,r,lm,weighted,R,Lm,Weighted,我试图弄清楚lm中的权重实际上是如何工作的,我看到了这一点,这为权重的工作提供了一些见解。下面部分复制并扩展了此问题的数据 我在交叉验证上发布。 library(plyr) set.seed(100) df <- data.frame(uid=1:200, bp=sample(x=c(100:200),size=200,replace=TRUE), age=sample(x=c(30:65),size=
lm
中的权重实际上是如何工作的,我看到了这一点,这为权重的工作提供了一些见解。下面部分复制并扩展了此问题的数据
我在交叉验证上发布。
library(plyr)
set.seed(100)
df <- data.frame(uid=1:200,
bp=sample(x=c(100:200),size=200,replace=TRUE),
age=sample(x=c(30:65),size=200,replace=TRUE),
weight=sample(c(1:10),size=200,replace=TRUE),
stringsAsFactors=FALSE)
set.seed(100)
df.double_weights <- data.frame(uid=1:200,
bp=sample(x=c(100:200),size=200,replace=TRUE),
age=sample(x=c(30:65),size=200,replace=TRUE),
weight=2*df$weight,
stringsAsFactors=FALSE)
df.expand <- ddply(df,
c("uid"),
function(df) {
data.frame(bp=rep(df[,"bp"],df[,"weight"]),
age=rep(df[,"age"],df[,"weight"]),
stringsAsFactors=FALSE)})
df.lm <- lm(bp~age,data=df,weights=weight)
df.double_weights.lm <- lm(bp~age,data=df.double_weights,weights=weight)
df.expand.lm <- lm(bp~age,data=df.expand)
summary(df.lm)
summary(df.double_weights.lm)
summary(df.expand.lm)
根据@IRTFM,自由度没有正确相加,提供以下代码来修复:
df.lm.aov <- anova(df.lm)
df.lm.aov$Df[length(df.lm.aov$Df)] <-
sum(df.lm$weights)-
sum(df.lm.aov$Df[-length(df.lm.aov$Df)] ) -1
df.lm.aov$`Mean Sq` <- df.lm.aov$`Sum Sq`/df.lm.aov$Df
df.lm.aov$`F value`[1] <- df.lm.aov$`Mean Sq`[1]/
df.lm.aov$`Mean Sq`[2]
df.lm.aov$`Pr(>F)`[1] <- pf(df.lm.aov$`F value`[1], 1,
df.lm.aov$Df, lower.tail=FALSE)[2]
df.lm.aov
Analysis of Variance Table
Response: bp
Df Sum Sq Mean Sq F value Pr(>F)
age 1 8741 8740.5 10.628 0.001146 **
Residuals 1176 967146 822.4
如果我正确理解了你的问题,你在权重栏中的内容通常被称为“频率权重”。它们用于通过指示每个协变量组合的观测数量来节省数据集中的空间 要使用“聚合”数据集估计模型并获得正确的标准误差,只需更正
lm
模型中的自由度
正确的自由度数是观测总数减去模型中的参数数。这可以通过取权重
变量之和,或通过查看“完整”数据中的观察总数,并减去估计的参数数(即系数)来计算
下面是一个更简单的例子,我认为这让问题更清楚:
库(dplyr)
图书馆(模型摘要)
种子集(1024)
#单个(真实)数据集
这个问题更多的是关于在lm
引擎盖下驱动数学运算的决策,而不是关于编码本身。我想你可能会在网上得到更好的答案。(有趣的问题,顺便说一下!)lm
文档的详细信息部分非常明确地解决了这个问题(段落以“Non-'NULL'”开头)。使用回归权重有很多原因,包括具有不同方差的观测值。在第三种情况下,您使用“复制权重”,并且lm
表示自由度可能错误,这显然会影响p值。感谢您的评论。我的问题本质上也是,我如何确定自由度(这也是实际问题),但我将尝试更清楚地说明这一点。我认为@IRTFM已经提供了一个特定的答案,但我不理解代码。非常感谢您的回答。我发现您的答案是直接使用sum(agg$freq)
计算权重。这是由IRTFM提出的更复杂的解决方案与IRTFM从输出中纠正df之间的区别吗?如果不是,是否有任何方法从输出中产生正确的df
(或简单地将权重添加到输出中)?我经常使用带有NA的数据,这使得sum(agg$freq)
提供了不正确的df
(因为它提供了所有权重的总和,而不仅仅是所选变量的权重)。我现在正在编写一个函数来纠正这一点,但我希望有一个更简单的解决方案。我想出来了,我只是修改了lm
函数。我添加了权重之和是的,应该可以。其思想是,您需要确定lm
函数在列表删除后用于计算回归系数的观察数。听起来你找到了一个方法。
df.lm.aov <- anova(df.lm)
df.lm.aov$Df[length(df.lm.aov$Df)] <-
sum(df.lm$weights)-
sum(df.lm.aov$Df[-length(df.lm.aov$Df)] ) -1
df.lm.aov$`Mean Sq` <- df.lm.aov$`Sum Sq`/df.lm.aov$Df
df.lm.aov$`F value`[1] <- df.lm.aov$`Mean Sq`[1]/
df.lm.aov$`Mean Sq`[2]
df.lm.aov$`Pr(>F)`[1] <- pf(df.lm.aov$`F value`[1], 1,
df.lm.aov$Df, lower.tail=FALSE)[2]
df.lm.aov
Analysis of Variance Table
Response: bp
Df Sum Sq Mean Sq F value Pr(>F)
age 1 8741 8740.5 10.628 0.001146 **
Residuals 1176 967146 822.4
Analysis of Variance Table
Response: bp
Df Sum Sq Mean Sq F value Pr(>F)
age 1 17481 17481.0 21.274 4.194e-06 ***
Residuals 2354 1934293 821.7
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1