2013-08-11 13 views
29

gdy próbuję definiować mój model liniowy R następująco:Błąd w kontrastów przy definiowaniu modelu liniowego w R

lm1 <- lm(predictorvariable ~ x1+x2+x3, data=dataframe.df) 

pojawia się następujący komunikat o błędzie:

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
contrasts can be applied only to factors with 2 or more levels 

Czy istnieje sposób zignorować to lub naprawić? Niektóre zmienne są czynnikami, a niektóre nie.

Odpowiedz

41

Jeśli twoja zmienna niezależna (zmienna RHS) jest czynnikiem lub znakiem przyjmującym tylko jedną wartość, wówczas występuje ten typ błędu.

Przykład iris dane R

(model1 <- lm(Sepal.Length ~ Sepal.Width + Species, data=iris)) 

# Call: 
# lm(formula = Sepal.Length ~ Sepal.Width + Species, data = iris) 

# Coefficients: 
#  (Intercept)  Sepal.Width Speciesversicolor Speciesvirginica 
#   2.2514    0.8036    1.4587    1.9468 

Teraz, jeśli dane składa się tylko z jednego gatunku:

(model1 <- lm(Sepal.Length ~ Sepal.Width + Species, 
       data=iris[iris$Species == "setosa", ])) 
# Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
# contrasts can be applied only to factors with 2 or more levels 

Jeśli zmienna jest liczbą (Sepal.Width), lecz równocześnie tylko jedna wartość powiedzieć 3, następnie model działa, ale otrzymasz NA jako współczynnik tej zmiennej w następujący sposób:

(model2 <-lm(Sepal.Length ~ Sepal.Width + Species, 
      data=iris[iris$Sepal.Width == 3, ])) 

# Call: 
# lm(formula = Sepal.Length ~ Sepal.Width + Species, 
# data = iris[iris$Sepal.Width == 3, ]) 

# Coefficients: 
#  (Intercept)  Sepal.Width Speciesversicolor Speciesvirginica 
#    4.700     NA    1.250    2.017 

Rozwiązanie: Nie ma wystarczającej zmienności w zmiennej zależnej z tylko jedną wartością. Musisz więc usunąć tę zmienną, niezależnie od tego, czy jest to wartość liczbowa, czy znakowa czy zmienna czynnikowa.

Updated jak za komentarze: Ponieważ wiesz, że błąd występuje tylko z/czynnik charakteru, można skupić się tylko na tych, i sprawdzić, czy długość poziomów tych zmiennych czynników jest 1 (DROP) lub większa niż 1 (NODROP).

Aby sprawdzić, czy zmienna jest czynnikiem, czy nie, należy użyć następującego kodu:

(l <- sapply(iris, function(x) is.factor(x))) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
#  FALSE  FALSE  FALSE  FALSE   TRUE 

Następnie można uzyskać ramkę danych zmiennych czynników tylko

m <- iris[, l] 

Teraz odnaleźć liczba poziomów zmiennych czynnikowych, jeśli to konieczne, należy zrzucić tę wartość: Uwaga: Jeśli poziomy f Aktor zmienna jest tylko jedna, to jest zmienna, musisz upuścić.

+0

OK dziękuję. Czy istnieje sposób, że mogę to naprawić w R lub jest to oryginalne dane, które należy edytować. Ponadto po przejrzeniu danych wszystkie zmienne przyjmują więcej niż jedną wartość? Czy jest jakiś sposób, aby zobaczyć, które konkretne zmienne mają na myśli? – REnthusiast

+0

Zobacz zaktualizowane rozwiązanie i skup się tylko na zmiennych czynnikowych. – Metrics

+0

Ponadto - jeśli zmienna zawiera "egzotyczne" znaki, pojawi się ten sam błąd. Który, jak sądzę, jest błędem. Moja zmienna CustomerType zawiera jedną wartość, która zawierała "ö", gdy zmieniłem, że błąd zniknął – ErrantBard

12

Wygląda na to, że co najmniej jeden z predyktorów, x1, x2 lub , ma tylko jeden poziom czynnika, a tym samym jest stałą.

Wystarczy popatrzeć na

lapply(dataframe.df[c("x1", "x2", "x3")], unique) 

aby znaleźć różne wartości.

1

Odpowiedzi na pytania i odpowiedzi w Svens dotyczą zwykłej sytuacji, ale dla nas, którzy pracują w środowisku nieanglojęzycznym, jeśli w zmiennej znakowej występują egzotyczne postacie (,, ä, ö), otrzymacie taki sam wynik, nawet jeśli poziomy wielu czynników.

Levels <- c("Pri", "För") daje błąd kontrastu, natomiast Levels <- c("Pri", "For") nie

robi to prawdopodobnie błąd.

0

Jest to odmiana do odpowiedzi udzielonej przez @Metrics i redakcją @Max Ghenis ...

l <- sapply(iris, function(x) is.factor(x)) 
m <- iris[,l] 

n <- sapply(m, function(x) { y <- summary(x)/length(x) 
len <- length(y[y<0.005 | y>0.995]) 
cbind(len,t(y))}) 

drop_cols_df <- data.frame(var = names(l[l]), 
          status = ifelse(as.vector(t(n[1,]))==0,"NODROP","DROP"), 
          level1 = as.vector(t(n[2,])), 
          level2 = as.vector(t(n[3,]))) 

Tutaj, po zidentyfikowaniu czynników zmiennych, drugi sapply wylicza jaki procent rekordy należą do każdego poziomu/kategoria zmiennej. Następnie określa liczbę poziomów ponad 99,5% lub poniżej 0,5% zapadalności (moje arbitralne progi).

Następnie przechodzi na powrót liczbę ważnych poziomach a zapadalnością na każdym poziomie w każdej zmiennej kategorycznego.

Zmienne o zerowych poziomach przekraczających progi nie powinny zostać pominięte, a drugi powinien być usunięty z modelu liniowego.

Ostatnia ramka danych ułatwia przeglądanie wyników. Kod ten jest mocno zakodowany dla tego zbioru danych, ponieważ wszystkie zmienne czynników są dwumianowe. Ta ramka danych może być łatwo sformułowana w sposób ogólny.

0

Ten komunikat o błędzie może się również zdarzyć, gdy dane zawiera NA s.

W tym przypadku zachowanie zależy od wartości domyślnych (patrz dokumentacja), a może wszystkie przypadki z NA w kolumnach wymienionych w zmiennych są po cichu upuszczone. Może się zdarzyć, że czynnik rzeczywiście ma kilka wyników, ale czynnik ma tylko jeden wynik przy ograniczeniu do przypadków bez NA.

W tym przypadku, aby rozwiązać problem, czy zmiana modelu (usunięcie czynnika problematyczne ze wzoru) lub zmiany danych (to znaczy zakończyć przypadków).

Powiązane problemy