Загружаем нужные пакеты:

library("ggplot2") # графики

# пакеты для графиков качественных переменных:

library("vcd")
library("alluvial")
# ставится с github командой devtools::install_github("mbojan/alluvial")

Создаем текстовую переменную из 100 случайно выбранных слов “yes”, “no”, “maybe”. Затем посмотрим её описание.

x <- sample(size = 100, c("yes","no","maybe"), rep = TRUE)
str(x) 
##  chr [1:100] "maybe" "no" "maybe" "yes" "yes" "yes" ...

Переведём нашу переменную из символьной в факторную.

x.factor <- factor(x)
str(x.factor)
##  Factor w/ 3 levels "maybe","no","yes": 1 2 1 3 3 3 1 3 3 3 ...

Графики

Можно построить гистограмму. Штатными средствами R:

plot(x.factor, main = "Любите ли вы сыр?", xlab = "Ответ мышки",
     ylab = "Количество мышек")

Та же гистограмма с помощью пакета ggplot2. Пакет ggplot2 работает с таблицами данных (data frame), поэтому предварительно создадим таблицу h со столбцом x.factor.

h <- data.frame(x.factor)
str(h)
## 'data.frame':    100 obs. of  1 variable:
##  $ x.factor: Factor w/ 3 levels "maybe","no","yes": 1 2 1 3 3 3 1 3 3 3 ...
ggplot(h) + geom_bar(aes(x.factor)) + labs(x = "Ответ мышки", 
     y = "Количество мышек", title = "Любите ли вы сыр?")

Есть пакет vcd с кучей графиков для нескольких качественных переменных. Например, мозаичный график:

tit <- Titanic
mosaic(~ Class + Sex + Survived, data = tit, shade = TRUE)

добавить parallel coordinates

добавить circular plot

Пакет alluvial позволяет строить графики одноимённого типа:

tit <- as.data.frame(Titanic)
alluvial(tit[,1:4], freq = tit$Freq, border = NA,
         hide = tit$Freq < quantile(tit$Freq, .50),
         col = ifelse(tit$Survived == "No", "red", "gray"))

Регрессии и смена базовой категории

Теперь можно строить регрессии и R автоматом будет вводить дамми в нужном количестве.

y <- rnorm(100)
x.model1 <- lm(y ~ x.factor)
summary(x.model1)
## 
## Call:
## lm(formula = y ~ x.factor)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.19772 -0.67786  0.08576  0.59761  1.73272 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  0.303258   0.134157   2.260   0.0260 *
## x.factorno  -0.006139   0.209751  -0.029   0.9767  
## x.factoryes -0.411520   0.196579  -2.093   0.0389 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8378 on 97 degrees of freedom
## Multiple R-squared:  0.05226,    Adjusted R-squared:  0.03272 
## F-statistic: 2.674 on 2 and 97 DF,  p-value: 0.07403

Мы легко можем указать категорию no в качестве базовой:

x.factor <- relevel(x.factor, ref = "no")
x.model2 <- lm(y ~ x.factor)
summary(x.model2)
## 
## Call:
## lm(formula = y ~ x.factor)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.19772 -0.67786  0.08576  0.59761  1.73272 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)  
## (Intercept)    0.297118   0.161237   1.843   0.0684 .
## x.factormaybe  0.006139   0.209751   0.029   0.9767  
## x.factoryes   -0.405381   0.215969  -1.877   0.0635 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8378 on 97 degrees of freedom
## Multiple R-squared:  0.05226,    Adjusted R-squared:  0.03272 
## F-statistic: 2.674 on 2 and 97 DF,  p-value: 0.07403

Для некоторых целей можно перевести факторную переменную в числовую:

x.num <- as.numeric(x.factor)
str(x.num)
##  num [1:100] 2 1 2 3 3 3 2 3 3 3 ...

Почиташки: