2012-04-22 118 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