Загружаем нужные пакеты:
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)
Пакет 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 ...
Почиташки: