2012-04-22 116 views
9

我创建了一个脚本,如下面的人做的东西我称之为“加权”回归:在R“加权”回归

library(plyr) 

set.seed(100) 

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

temp.df.expand <- ddply(temp.df, 
         c("uid"), 
         function(df) { 
          data.frame(bp=rep(df[,"bp"],df[,"weight"]), 
            age=rep(df[,"age"],df[,"weight"]), 
            stringsAsFactors=FALSE)}) 

temp.df.lm <- lm(bp~age,data=temp.df,weights=weight) 
temp.df.expand.lm <- lm(bp~age,data=temp.df.expand) 

你可以看到,在temp.df,每一行都有它的重量,什么我的意思是总共有1178个样本,但对于行数相同的bpage,它们合并为1行,并在weight列中表示。

我用weight参数在lm功能,然后我交叉与另一个数据帧,该数据帧temp.df被“膨胀”检查结果。但是我发现2个数据帧的输出不同lm

难道我误解在lm功能weight参数,任何人都可以让我知道我如何运行回归正常(即无需手动扩展数据帧)为呈现像temp.df数据集呢?谢谢。

+0

这两个回归对我来说产生相同的结果。 – 2012-04-22 14:25:55

+1

查看'summary'输出,它们不同 – lokheart 2012-04-22 14:26:49

+5

系数相同,但p值确实不同。我猜想会发生以下情况。当你扩展数据时,观察被认为是独立的:由于有大量数据,你可以对估计非常有信心,并且P值低。当使用权重时,观测值的数量仍然很小,并且p值很高。 – 2012-04-22 14:32:57

回答

12

这里的问题是自由度未被正确地加起来以得到正确的Df和均方和平方统计。这将解决该问题:

temp.df.lm.aov <- anova(temp.df.lm) 
temp.df.lm.aov$Df[length(temp.df.lm.aov$Df)] <- 
     sum(temp.df.lm$weights)- 
     sum(temp.df.lm.aov$Df[-length(temp.df.lm.aov$Df)] ) -1 
temp.df.lm.aov$`Mean Sq` <- temp.df.lm.aov$`Sum Sq`/temp.df.lm.aov$Df 
temp.df.lm.aov$`F value`[1] <- temp.df.lm.aov$`Mean Sq`[1]/ 
             temp.df.lm.aov$`Mean Sq`[2] 
temp.df.lm.aov$`Pr(>F)`[1] <- pf(temp.df.lm.aov$`F value`[1], 1, 
             temp.df.lm.aov$Df, lower.tail=FALSE)[2] 
temp.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   

比较:

> anova(temp.df.expand.lm) 
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      
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

我有点惊讶这还没有拿出更多的时候在R-帮助。无论是那种还是我的搜索策略发展能力都随着年龄的增长而减弱。

+0

上面的代码块有错误('temp.df.lm.aovn Sq'< - temp.df.lm.aov $'Sum Sq'/ temp.df.lm.aov $ Df' )。请注意,代码没有解决问题(ANOVA表不同)。 – gung 2013-06-08 02:28:26

+0

我试图更正。请确保您批准。请注意,我使用了子集/索引(即'[1]'),并不清楚这是你的风格/一般,因为你可能已经想要这样做。 (但是,输出现在与您想要的输出相匹配。) – gung 2013-06-08 02:43:52

+0

有句法错误(无法匹配的back-ticks),我没有时间调查。感谢您尝试修复它。 – 2013-06-08 03:42:17