it-swarm.com.de

Fehler in Kontrasten bei der Definition eines linearen Modells in R

Wenn ich versuche, mein lineares Modell in R wie folgt zu definieren:

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

Ich erhalte folgende Fehlermeldung:

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

Gibt es eine Möglichkeit, dies zu ignorieren oder zu beheben? Einige der Variablen sind Faktoren und andere nicht.

33
REnthusiast

Wenn Ihre unabhängige Variable (RHS-Variable) ein Faktor ist oder ein Zeichen, das nur einen Wert annimmt, tritt dieser Fehlertyp auf. 

Beispiel: Irisdaten in 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  

Wenn Ihre Daten nur aus einer Art bestehen: 

(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

Wenn die Variable numerisch ist (Sepal.Width), aber nur einen einzigen Wert, beispielsweise 3, verwendet, wird das Modell ausgeführt, aber Sie erhalten NA als Koeffizienten dieser Variablen wie folgt:

(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

Lösung : Es gibt nicht genug Variationen in abhängigen Variablen mit nur einem Wert. Daher müssen Sie diese Variable löschen, unabhängig davon, ob es sich um eine numerische oder eine Zeichen- oder eine Faktorvariable handelt. 

Gemäß den Kommentaren aktualisiert: Da Sie wissen, dass der Fehler nur bei einem Faktor/-Zeichen auftritt, können Sie sich nur auf diese konzentrieren und sehen, ob die Länge der Stufen dieser Faktorvariablen 1 (DROP) oder mehr als 1 ( KEIN TROPFEN). 

Um zu sehen, ob die Variable ein Faktor ist, verwenden Sie den folgenden Code: 

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

Dann können Sie nur den Datenrahmen von Faktorvariablen erhalten

m <- iris[, l]

Finden Sie nun die Anzahl der Ebenen der Faktorvariablen. Wenn dies eine ist, müssen Sie diese löschen 

ifelse(n <- sapply(m, function(x) length(levels(x))) == 1, "DROP", "NODROP")

Hinweis: Wenn es sich bei den Faktorvariablen nur um eine Ebene handelt, müssen Sie die Variable löschen. 

49
Metrics

Es scheint, dass mindestens einer Ihrer Prädiktoren, x1, x2 oder x3, nur eine Faktorebene hat und daher eine Konstante ist.

Schaut mal rein

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

um die verschiedenen Werte zu finden.

14
Sven Hohenstein

Metrics und Svens antworten auf die übliche Situation, aber für uns, die in nicht-englischen Umgebungen arbeiten, wenn Sie exotische Zeichen (å, ä, ö) in Ihrer Zeichenvariablen haben, erhalten Sie dasselbe Ergebnis, auch wenn Sie mehrere Faktorstufen haben. 

Levels <- c("Pri", "För") gibt den Kontrastfehler an, während Levels <- c("Pri", "For") dies nicht tut

Dies ist wahrscheinlich ein Fehler.

3
ErrantBard

Diese Fehlermeldung kann auch auftreten, wenn die Daten NAs enthalten.

In diesem Fall hängt das Verhalten von den Standardwerten ab (siehe Dokumentation), und möglicherweise werden alle Fälle mit NA in den in den Variablen genannten Spalten unbemerkt verworfen. Es kann also sein, dass ein Faktor tatsächlich mehrere Ergebnisse hat, aber der Faktor hat nur ein Ergebnis, wenn er sich auf die Fälle ohne NA beschränkt.

Um den Fehler zu beheben, ändern Sie in diesem Fall entweder das Modell (entfernen Sie den problematischen Faktor aus der Formel) oder ändern Sie die Daten (d. H. Füllen Sie die Fälle aus).

2
jarauh

Wenn der Fehler darauf zurückzuführen ist, dass Ihre Daten über NAs verfügen, müssen Sie die glm () -Funktionsoptionen für die Behandlung der NA-Fälle festlegen. Weitere Informationen hierzu finden Sie in einem entsprechenden Beitrag hier: https://stats.stackexchange.com/questions/46692/how-the-na-values-are-treated-in-glm-in-r

0
Sadiaz

Dies ist eine Variation der Antwort von @Metrics und bearbeitet von @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,])))

Nach der Identifizierung von Faktorvariablen berechnet der zweite sapply, wie viel Prozent der Datensätze zu jeder Ebene/Kategorie der Variablen gehören. Dann wird die Anzahl der Ebenen mit einer Inzidenzrate von über 99,5% oder weniger als 0,5% (meine willkürlichen Schwellenwerte) ermittelt. 

Anschließend wird in jeder kategorialen Variablen die Anzahl der gültigen Ebenen und die Inzidenzrate für jede Ebene zurückgegeben. 

Variablen mit Nullpegeln, die die Schwellenwerte überschreiten, sollten nicht gelöscht werden, während die anderen aus dem linearen Modell entfernt werden sollten. 

Der letzte Datenrahmen erleichtert das Anzeigen der Ergebnisse. Es ist für diesen Datensatz hart codiert, da alle Faktorvariablen binomial sind. Dieser Datenrahmen kann leicht genug generisch gemacht werden. 

0
dk_b