Данная заметка - это любительский перевод статьи Julia Silge.
Эта статья взята из блога Julia Silge, которая демонстрирует использование пакетов tidymodels. В сегодняшней заметке будет показана относительно новая функция из пакета rsample - reg_intervals. Данная функция разработана для быстрого поиска доверительных интервалов bootstrap.
Данные: набор #TidyTuesday о рекламных роликах суперкубка.
Знакомимся с данными
Наша цель выяснить, как с течением времени менялись характеристики рекламных роликов суперкубка. В наших данных не так много наблюдений, что позволяет нам использовать метод bootstrap для демонстрации.
Прочитаем наши данные:
library(tidyverse)
youtube <- read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-03-02/youtube.csv")
Давайте сделаем некоторые преобразование и посмотрим, как ведут себя данные с течением времени.
youtube %>%
select(year, funny:use_sex) %>%
pivot_longer(funny:use_sex) %>%
group_by(year, name) %>%
summarise(prop = mean(value)) %>%
ungroup() %>%
ggplot(aes(year, prop, color = name)) +
geom_line(size = 1.2, show.legend = FALSE) +
facet_wrap(~name) +
scale_y_continuous(labels = scales::percent) +
labs(x = NULL, y = "% of commercials")
Сделаем простую модель
Не смотря на то, что данные не выглядят идеально линейными, мы можем использовать линейную модель для оценки наших характеристик.
simple_mod <- lm(year ~ funny + show_product_quickly + patriotic + celebrity + danger + animals + use_sex,
data = youtube)
summary(simple_mod)
Call:
lm(formula = year ~ funny + show_product_quickly + patriotic +
celebrity + danger + animals + use_sex, data = youtube)
Residuals:
Min 1Q Median 3Q Max
-12.5254 -4.1023 0.1456 3.9662 10.1727
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2011.0838 0.9312 2159.748 < 2e-16 ***
funnyTRUE -2.8979 0.8593 -3.372 0.00087 ***
show_product_quicklyTRUE 0.7706 0.7443 1.035 0.30160
patrioticTRUE 2.0455 1.0140 2.017 0.04480 *
celebrityTRUE 2.4416 0.7767 3.144 0.00188 **
dangerTRUE 0.4814 0.7846 0.614 0.54007
animalsTRUE 0.1082 0.7330 0.148 0.88274
use_sexTRUE -2.4041 0.8175 -2.941 0.00359 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.391 on 239 degrees of freedom
Multiple R-squared: 0.178, Adjusted R-squared: 0.1539
F-statistic: 7.393 on 7 and 239 DF, p-value: 4.824e-08
Мы получили статистические свойства линейной модели, но мы можем использовать bootstrap для того, чтобы оценить дисперсию наших величин. В этом нам поможет пакет rsample.
library(rsample)
bootstraps(youtube, times = 1000)
# Bootstrap sampling
# A tibble: 1,000 × 2
splits id
<list> <chr>
1 <split [247/87]> Bootstrap0001
2 <split [247/85]> Bootstrap0002
3 <split [247/88]> Bootstrap0003
4 <split [247/83]> Bootstrap0004
5 <split [247/87]> Bootstrap0005
6 <split [247/84]> Bootstrap0006
7 <split [247/92]> Bootstrap0007
8 <split [247/84]> Bootstrap0008
9 <split [247/91]> Bootstrap0009
10 <split [247/86]> Bootstrap0010
# … with 990 more rows
Нам бы пришлось выполнить достаточно много предварительных шагов, чтобы найти доверительные интервалы. Поэтому в пакете rsample предусмотрена функция reg_intervals(), которая находит доверительные интервалы для моделей типа: lm(), glm().
set.seed(123)
youtube_intervals <- reg_intervals(year ~ funny + show_product_quickly + patriotic + celebrity + danger + animals + use_sex,
data = youtube,
type = "percentile",
keep_reps = TRUE)
youtube_intervals
# A tibble: 7 × 7
term .lower .estimate .upper .alpha .method .replicates
<chr> <dbl> <dbl> <dbl> <dbl> <chr> <list<tibble>
1 animalsTRUE -1.22 0.144 1.51 0.05 percentile [2,001 × 2]
2 celebrityTRUE 0.828 2.46 4.06 0.05 percentile [2,001 × 2]
3 dangerTRUE -1.01 0.515 2.09 0.05 percentile [2,001 × 2]
4 funnyTRUE -4.58 -2.91 -1.26 0.05 percentile [2,001 × 2]
5 patrioticTRUE 0.112 2.05 3.88 0.05 percentile [2,001 × 2]
6 show_product_quicklyTRUE -0.839 0.740 2.23 0.05 percentile [2,001 × 2]
7 use_sexTRUE -4.04 -2.43 -0.952 0.05 percentile [2,001 × 2]
Посмотри на результаты bootstrap
Мы можем визуализировать наши результаты. Обратим внимание, что если бы мы не установил параметр keep_reps = TRUE, то у нас были бы только интервалы и мы бы не смогли построить график №3.
youtube_intervals %>%
mutate(term = str_remove(term, "TRUE"),
term = fct_reorder(term, .estimate)) %>%
ggplot(aes(.estimate, term)) +
geom_vline(xintercept = 0, size = 1.5, lty = 2, color = "gray80") +
geom_errorbarh(aes(xmin = .lower, xmax = .upper),
size = 1.5, alpha = 0.5, color = "midnightblue") +
geom_point(size = 3, color = "midnightblue") +
labs(x = "Increase in year for each commercial characteristic",
y = NULL)
outube_intervals %>%
mutate(term = str_remove(term, "TRUE"),
term = fct_reorder(term, .estimate)) %>%
unnest(.replicates) %>%
ggplot(aes(estimate, fill = term)) +
geom_vline(xintercept = 0, size = 1.5, lty = 2, color = "gray50") +
geom_histogram(alpha = 0.8, show.legend = FALSE) +
facet_wrap(vars(term))
Таким образом, мы видим, что рекламные ролики содержат меньше юмора и сексуального контента, и больше рубрик селебрити и патриотических тем.