2012-04-22 16 views
9

Stworzyłem skrypt jak poniżej, aby zrobić coś, co zwane jako „ważonej” regresji:„ważone” regresji w 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) 

Widać, że w temp.df, każdy wiersz ma swoją wagę, co Chodzi mi o to, że w sumie jest 1178 próbek, ale w przypadku wierszy z tymi samymi bp i age są one scalane w jeden wiersz i reprezentowane w kolumnie weight.

że stosowane parametry weight w funkcji lm, to krzyżują sprawdzić wynik z innym dataframe że temp.df dataframe jest „rozciągany”. Zauważyłem jednak, że wyjścia lm różnią się dla dwóch ramek danych.

Czy ja źle zinterpretować parametry weight w lm funkcji, a może ktoś dać mi znać, jak biegnę regresji prawidłowo (tzn bez zwiększania dataframe ręcznie) dla zbioru danych prezentowanych jak temp.df? Dzięki.

+0

Te dwie regresje dają identyczne wyniki. –

+1

zobacz dane wyjściowe 'summary', są one różne – lokheart

+5

Współczynniki są takie same, ale wartości p są rzeczywiście różne. Myślę, że następujące czynności. Po rozszerzeniu danych zakłada się, że obserwacje są niezależne: ponieważ istnieje wiele danych, można mieć pewność co do oszacowań, a wartości p są niskie. Podczas stosowania wag liczba obserwacji pozostaje mała, a wartości p są wysokie. –

Odpowiedz

12

Problem polega na tym, że stopnie swobody nie są odpowiednio dodawane, aby uzyskać odpowiednie statystyki Df i średniej sumy kwadratów. Pozwoli to rozwiązać problem:

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   

Porównaj z:

> 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 

Jestem nieco zaskoczony, to nie ma pochodzić częściej na R-pomoc. Albo to, albo moja moc rozwoju strategii wyszukiwania, słabnie ze starością.

+0

Wystąpił błąd w górnym bloku kodu ('temp.df.lm.aovn Sq '<- temp.df.lm.aov $' Sum Sq '/ temp.df.lm.aov $ Df'). Zauważ, że kod nie naprawił problemu (tabele ANOVA są różne). – gung

+0

Próbowałem korekty. Upewnij się, że zatwierdzasz. Zwróć uwagę, że użyłem podsekcji/indeksowania (tj. '[1]') i nie jest jasne, czy to twój styl/tak ogólne, jak być może chciałeś. (Jednak dane wyjściowe są teraz zgodne z danymi wyjściowymi, które były potrzebne). – gung

+0

Wystąpiły błędy składniowe (niedopasowane tyłki zwrotne), których nie miałem czasu zbadać. Dzięki za próbę naprawy. –

Powiązane problemy