Как исправить: контрасты могут применяться только к факторам с 2 или более уровнями


Одна распространенная ошибка, с которой вы можете столкнуться в R:

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

Эта ошибка возникает, когда вы пытаетесь подобрать регрессионную модель, используя предикторную переменную, которая является либо фактором, либо символом и имеет только одно уникальное значение.

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

Пример: как исправить «контрасты могут применяться только к факторам с 2 или более уровнями»

Предположим, у нас есть следующий фрейм данных в R:

#create data frame
df <- data.frame(var1=c(1, 3, 3, 4, 5),
 var2=as. factor (4),
 var3=c(7, 7, 8, 3, 2),
 var4=c(1, 1, 2, 8, 9))

#view data frame
df

 var1 var2 var3 var4
1 1 4 7 1
2 3 4 7 1
3 3 4 8 2
4 4 4 3 8
5 5 4 2 9

Обратите внимание, что предикторная переменная var2 является фактором и имеет только одно уникальное значение.

Если мы попытаемся подобрать модель множественной линейной регрессии, используя var2 в качестве одной из переменных-предикторов, мы получим следующую ошибку:

#attempt to fit regression model
model <- lm(var4 ~ var1 + var2 + var3, data=df)

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

Мы получаем эту ошибку, потому что var2 имеет только одно уникальное значение: 4. Поскольку в этой предикторной переменной вообще нет никаких изменений, R не может эффективно соответствовать регрессионной модели.

На самом деле мы можем использовать следующий синтаксис для подсчета количества уникальных значений для каждой переменной в нашем фрейме данных:

#count unique values for each variable
sapply( lapply(df, unique), length)

var1 var2 var3 var4 
 4 1 4 4

И мы можем использовать функцию lapply() для отображения каждого из уникальных значений для каждой переменной:

#display unique values for each variable
lapply(df[c('var1', 'var2', 'var3')], unique)

$var1
[1] 1 3 4 5

$var2
[1] 4
Levels: 4

$var3
[1] 7 8 3 2

Мы видим, что var2 — единственная переменная, которая имеет одно уникальное значение. Таким образом, мы можем исправить эту ошибку, просто исключив var2 из регрессионной модели:

#fit regression model without using *var2* as a predictor variable
model <- lm(var4 ~ var1 + var3, data=df)

#view model summary
summary(model)

Call:
lm(formula = var4 ~ var1 + var3, data = df)

Residuals:
 1 2 3 4 5 
 0.02326 -1.23256 0.91860 0.53488 -0.24419 

Coefficients:
 Estimate Std. Error t value Pr(>|t|) 
(Intercept) 8.4070 3.6317 2.315 0.1466 
var1 0.6279 0.6191 1.014 0.4172 
var3 -1.1512 0.3399 -3.387 0.0772 .
---
Signif. codes: 0 ‘\*\*\*’ 0.001 ‘\*\*’ 0.01 ‘\*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.164 on 2 degrees of freedom
Multiple R-squared: 0.9569, Adjusted R-squared: 0.9137 
F-statistic: 22.18 on 2 and 2 DF, p-value: 0.04314

Отбрасывая var2 из регрессионной модели, мы больше не сталкиваемся с ошибкой, которая была раньше.

Дополнительные ресурсы

Как выполнить простую линейную регрессию в R
Как выполнить множественную линейную регрессию в R
Как выполнить логистическую регрессию в R

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.