2012-04-22 23 views
9

Tôi đã tạo ra một kịch bản như hình dưới đây để làm một cái gì đó tôi gọi là "trọng" hồi quy:hồi quy "trọng" trong 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) 

Bạn có thể thấy rằng trong temp.df, mỗi hàng có trọng lượng của nó, những gì Ý tôi là có tổng cộng 1178 mẫu nhưng đối với các hàng có cùng số bpage, chúng được hợp nhất thành 1 hàng và được thể hiện trong cột weight.

Tôi đã sử dụng thông số weight trong chức năng lm, sau đó tôi kiểm tra chéo kết quả bằng một khung dữ liệu khác là dataframe temp.df được "mở rộng". Nhưng tôi tìm thấy các kết quả đầu ra lm khác nhau cho 2 khung dữ liệu.

Ý của tôi hiểu sai các thông số weight trong lm chức năng, và bất cứ ai có thể cho tôi biết làm thế nào để tôi chạy hồi quy đúng (nghĩa là không phải mở rộng dataframe bằng tay) cho một tập dữ liệu được trình bày như temp.df? Cảm ơn.

+0

Hai hồi quy mang lại kết quả giống hệt nhau cho tôi. –

+1

xem đầu ra 'tóm tắt', chúng khác nhau – lokheart

+5

Các hệ số giống nhau, nhưng giá trị p thực sự khác nhau. Tôi đoán điều sau xảy ra. Khi bạn mở rộng dữ liệu, các quan sát được giả định là độc lập: vì có rất nhiều dữ liệu, bạn có thể rất tự tin về các ước tính và giá trị p thấp. Khi sử dụng trọng số, số lượng quan sát vẫn còn nhỏ và giá trị p cao. –

Trả lời

12

Vấn đề ở đây là mức độ tự do không được thêm đúng để có được số liệu thống kê Df và bình phương-bình phương. Điều này sẽ khắc phục sự cố:

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   

So sánh với:

> 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 

Tôi là một chút ngạc nhiên này đã không đưa ra thường xuyên hơn trên R-giúp đỡ. Hoặc là sức mạnh phát triển chiến lược tìm kiếm của tôi đang suy yếu với tuổi già.

+0

Có lỗi trong khối trên của mã ('temp.df.lm.aovn Sq '<- temp.df.lm.aov $' Sum Sq '/ temp.df.lm.aov $ Df'). Lưu ý rằng mã không sửa vấn đề (các bảng ANOVA khác nhau). – gung

+0

Tôi đã thử chỉnh sửa. Hãy đảm bảo bạn chấp thuận. Lưu ý rằng tôi đã sử dụng tính năng lập chỉ mục/lập chỉ mục (ví dụ: '[1]') và không rõ ràng đó là phong cách của bạn/chung chung như bạn có thể muốn. (Tuy nhiên, đầu ra hiện nay phù hợp với đầu ra mà bạn muốn nó.) – gung

+0

Có lỗi cú pháp (các dấu back-uns chưa từng có) mà tôi không có thời gian để điều tra. Cảm ơn bạn đã cố khắc phục. –