Ответ 1
Если ваша независимая переменная (переменная RHS) является фактором или символом, принимающим только одно значение, тогда возникает этот тип ошибки.
Пример: данные диафрагмы в 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
Теперь, если ваши данные состоят только из одного вида:
(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
Если переменная является числовой (Sepal.Width
), но принимает только одно значение, скажем 3, тогда модель запускается, но вы получите NA
как коэффициент для этой переменной следующим образом:
(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
Решение. В зависимой переменной недостаточно вариации с одним значением. Таким образом, вам нужно отбросить эту переменную, независимо от того, является ли это числовой или символьной или факторной переменной.
Обновлено в соответствии с комментариями:. Поскольку вы знаете, что ошибка будет возникать только с фактором/символом, вы можете сосредоточиться только на них и посмотреть, будет ли длина уровней этих факторных переменных равна 1 (DROP ) или больше 1 (NODROP).
Чтобы узнать, является ли переменная фактором или нет, используйте следующий код:
(l <- sapply(iris, function(x) is.factor(x)))
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# FALSE FALSE FALSE FALSE TRUE
Тогда вы можете получить только фрейм данных переменных факторов
m <- iris[, l]
Теперь найдите количество уровней факторных переменных, если это нужно, нужно отбросить этот
ifelse(n <- sapply(m, function(x) length(levels(x))) == 1, "DROP", "NODROP")
Примечание. Если уровни факторной переменной являются только одной, то это переменная, вам нужно отказаться.