Подтвердить что ты не робот

Ошибка при контрастах при определении линейной модели в R

Когда я пытаюсь определить свою линейную модель в R следующим образом:

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

Появляется следующее сообщение об ошибке:

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

Есть ли способ игнорировать это или исправить? Некоторые из переменных являются факторами, а некоторые - нет.

4b9b3361

Ответ 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")

Примечание. Если уровни факторной переменной являются только одной, то это переменная, вам нужно отказаться.

Ответ 2

Похоже, что хотя бы один из ваших предикторов x1, x2 или x3 имеет только один факторный уровень и, следовательно, является константой.

Посмотрите

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

чтобы найти разные значения.

Ответ 3

Метрики и Svens отвечают на обычную ситуацию, но для нас, работающих в неанглийских средах, если у вас есть экзотические персонажи (å, ä, ö) в вашей переменной символов, вы получите тот же результат, даже если у вас есть несколько факторов.

Levels <- c("Pri", "För") дает ошибку контрастности, а Levels <- c("Pri", "For") не

Вероятно, это ошибка.

Ответ 4

Это вариант ответа, предоставленного @Metrics и отредактированный @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,])))

Здесь, после определения факторных переменных, второй sapply вычисляет, какой процент записей принадлежит каждому уровню/категории переменной. Затем он определяет количество уровней более 99,5% или менее 0,5% (мои произвольные пороги).

Затем он продолжает возвращать количество допустимых уровней и уровень заболеваемости каждого уровня в каждой категориальной переменной.

Переменные с нулевыми уровнями, пересекающими пороговые значения, не следует отбрасывать, а другой - с линейной модели.

Последний кадр данных облегчает просмотр результатов. Он жестко закодирован для этого набора данных, поскольку все факторные переменные являются биномиальными. Этот фрейм данных можно сделать достаточно простым.

Ответ 5

Это сообщение об ошибке может также произойти, когда данные содержат NA s.

В этом случае поведение зависит от значений по умолчанию (см. документацию), и, возможно, все случаи с NA в столбцах, упомянутых в переменных, молча удаляются. Таким образом, может быть, что фактор действительно имеет несколько результатов, но фактор имеет только один результат, ограничивая случаи без NA.

В этом случае, чтобы исправить ошибку, либо измените модель (удалите проблемный фактор из формулы), либо измените данные (то есть заполните случаи).