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.
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.
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.
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.
Diese Fehlermeldung kann auch auftreten, wenn die Daten NA
s 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).
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
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.