2013-08-22 44 views
8

I zostały utworzone dwa ogólny model liniowy, co następuje:błąd R, który mówi „modele nie były zamontowane do tej samej wielkości zbioru danych”

glm1 <-glm(Y ~ X1 + X2 + X3, family=binomial(link=logit)) 

glm2 <-glm(Y ~ X1 + X2, family=binomial(link=logit)) 

I wtedy korzystać z anova funkcję:

anova(glm2,glm1) 

ale pojawia się komunikat o błędzie:

„błąd w anova.glmlist (c (lista (object), dotargs), dyspersja = dyspersja:
modele nie były dopasowane do tego samego rozmiaru zestawu danych "

Co to znaczy i jak mogę to naprawić? Mam attach ed zestaw danych na początku mojego kodu, więc oba modele działają z tego samego zestawu danych.

+3

Na marginesie nie używaj 'attach()'. –

+1

Ponadto, zakładam, że użyłeś 'glm (Y ~ X1 ...)', a nie tylko '(Y ~ X1 ...)'? I dlaczego masz przecinki oddzielające zmienne? –

+0

Tak, użyłem tego. Przeprosiny, o których wcześniej nie pisałem tego poprawnie. Masz pojęcie, co może być nie tak? – REnthusiast

Odpowiedz

9

Główną przyczyną tego błędu jest brak wartości w jednej lub więcej zmiennych predykcyjnych. W ostatnich wersjach R domyślną akcją jest pominięcie wszystkich wierszy, w których brakuje jakichkolwiek wartości (poprzednią wartością domyślną było wygenerowanie błędu). Na przykład, jeśli ramka danych ma 100 wierszy i brakuje jednej wartości w X3, to twój model glm1 będzie pasował do 99 wierszy danych (zrzucając wiersz, w którym brakuje X3), ale obiekt glm2 będzie pasował do pełnego 100 wierszy danych (ponieważ nie używa X3, nie trzeba usuwać żadnych wierszy).

Tak więc funkcja anova daje błąd, ponieważ 2 modele pasowały do ​​różnych zestawów danych (i jak obliczać stopnie swobody itp.).

Jednym z rozwiązań jest utworzenie nowej ramki danych zawierającej tylko kolumny, które będą używane w co najmniej jednym z modeli i usuwanie wszystkich wierszy z brakującymi wartościami (funkcja na.omit lub na.exclude ułatwi to), następnie dopasuj oba modele do tej samej ramki danych, która nie ma żadnych brakujących wartości.

Inne opcje to przeglądanie narzędzi do wielokrotnego imputowania lub innych sposobów radzenia sobie z brakującymi danymi.

+0

Dziękuję za to, to było bardzo wyjaśniające. Wydaje się działać, gdy przestałem używać załącznika i zdecydowałem się określić dane w każdym kroku. Czy działa to tylko przez przypadek? Ponadto, chcę uzyskać wartość p z anova między glm1 i różnymi innymi glms. Jak mam to zrobic? – REnthusiast

+0

@Denis, Z 'attach' możesz mieć zmienną o tej samej nazwie w środowisku globalnym/workspace, która wprowadzała problem. Jednym z powodów, dla których nie należy używać 'attach'. Aby uzyskać wartość p z 'anova' dodaj' test = "Chisq" ', zobacz'? Anova.glm' po szczegóły (i upewnij się, że jesteś zadowolony z założeń). –

0

Zgaduję, że masz na myśli wpisać:

glm1 <-glm(Y ~ X1+X2+X3, family=binomial(link=logit)) 

glm2 <-glm(Y ~ X1 + X2, family=binomial(link=logit)) 

Interfejs formuła R funkcji regresji nie rozpoznaje przecinków jak dodawanie współzmiennych do RHS wzoru. I nie używaj attach(); użyj argumentu danych do funkcji regresji.

+0

Tak, zrobiłem to wszystko i nadal wydaje się, że błąd. Wprowadziłem również: na.omit = na.pass, aby zobaczyć puste komórki w moich danych traktowane inaczej w R, ale bez skutku. Masz pomysł, co mogę zrobić źle? – REnthusiast

+1

Chciałbym użyć argumentu 'data', który był taki sam dla obu wywołań' glm': na.omit (YourData [, c ("Y", "X1", "X2", "X3")]) '. W ten sposób usuniesz "dodatkowe przypadki", które są obecne dla X1 i X2, które nie są w X3. –

+0

Czy umieściłem ten glm1 <-glm (Y ~ X1 + X2 + X3, rodzina = dwumianowy (link = logit), na.omit (TwojaData [, c ("Y", "X1", "X2", "X3 ")])) podczas definiowania obu glms? – REnthusiast

1

Rozwiązaniem jest użycie:

glm1 <-glm(Y ~ X1 + X2 + X3, family = binomial(link = logit), na.action = na.exclude) 
glm2 <-glm(Y ~ X1 + X2, family = binomial(link = logit), na.action = na.exclude) 

anova(glm2,glm1) 

Spowoduje to, że R obejmuje przypadki z brakującymi danymi (NA) dopasowanego modelu. Dzięki temu zbiory danych są identyczne w różnych modelach dopasowań, niezależnie od tego, jak rozproszone są dane.

+2

Metoda 'na.exclude' niekoniecznie musi działać. Spróbuj tego: 'mtcars [1,2] <- NA; xa <- lm (mpg ~ cyl + disp, mtcars, na.action = na.exclude); xaa <- lm (mpg ~ disp, mtcars, na.action = na.exclude); anova (xa, xaa) ' – landroni

+0

Masz rację. W tym przypadku nie działa. Zapewnia jednak, że 'predict' wstawi' NA' dla punktów danych, które mają brakujące wartości w danych. Czytając dokumentację dla 'na.exclude', zauważa, że ​​działa to tylko dla' naresid' i 'napredict', które są połączone z' resid' i 'predict'.Najwyraźniej "anova" używa czegoś innego. Najwyraźniej najpierw trzeba będzie dokonać podzbioru kompletnych spraw, np. używając 'na.omit'. Przynajmniej to jest [porada udzielona tutaj] (https://stat.ethz.ch/pipermail/r-help/2011-January/266199.html). – Deleet

+1

Istnieją co najmniej dwa proste podejścia do tego, które omawiam w [tej odpowiedzi] (http://stackoverflow.com/questions/18387258/r-error-which-says-models-were-not-all-fitted- na ten sam rozmiar zbioru danych/37416336 # 37416336). – landroni

3

Aby uniknąć błędu "models were not all fitted to the same size of dataset", należy dopasować oba modele do dokładnie tego samego podzbioru danych.Istnieją dwa proste sposoby, aby to zrobić:

  • użyć data=glm1$model w 2. modelu pasuje
  • lub pobrać prawidłowo subsetted zestawu danych za pomocą data=na.omit(orig.data[ , all.vars(formula(glm1))]) w 2. modelu pasuje

Oto powtarzalne przykład stosując lm (dla glm samo podejście powinno działać) i update:

# 1st approach 
# define a convenience wrapper 
update_nested <- function(object, formula., ..., evaluate = TRUE){ 
    update(object = object, formula. = formula., data = object$model, ..., evaluate = evaluate) 
} 

# prepare data with NAs 
data(mtcars) 
for(i in 1:ncol(mtcars)) mtcars[i,i] <- NA 

xa <- lm(mpg~cyl+disp, mtcars) 
xb <- update_nested(xa, .~.-cyl) 
anova(xa, xb) 
## Analysis of Variance Table 
## 
## Model 1: mpg ~ cyl + disp 
## Model 2: mpg ~ disp 
## Res.Df RSS Df Sum of Sq  F Pr(>F) 
## 1  26 256.91        
## 2  27 301.32 -1 -44.411 4.4945 0.04371 * 
## --- 
## Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

# 2nd approach 
xc <- update(xa, .~.-cyl, data=na.omit(mtcars[ , all.vars(formula(xa))])) 
anova(xa, xc) 
## Analysis of Variance Table 
## 
## Model 1: mpg ~ cyl + disp 
## Model 2: mpg ~ disp 
## Res.Df RSS Df Sum of Sq  F Pr(>F) 
## 1  26 256.91        
## 2  27 301.32 -1 -44.411 4.4945 0.04371 * 
## --- 
## Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Zobacz także:

0

Przyczyną jest dobrze opisany przez Greg śniegu. Alternatywnym i bardzo łatwym rozwiązaniem jest dodanie nowej zmiennej, dopasowując NA danej zmiennej problemowej, a poza tym wartość 1. Uwzględnij ją w obu modelach, a R wykluczy te same wiersze w obu modelach (- dopasują zbiory danych).