Как исправить: контрасты могут применяться только к факторам с 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