library('dplyr')
4 Престратификация
Материал написан на основе статьи Xie, H., & Aurisset, J. (2016, August). Improving the sensitivity of online controlled experiments: Case studies at netflix. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (pp. 645-654).
4.1 Стратификация (stratification sampling)
Мы помним, что снижение дисперсии снижает необходимое число наблюдений.
Предположим, что мы выбрали переменную, по которой мы можем разбить нашу выборку на группы (страты). Пусть таких групп K штук, а \(n_k\) – численность каждой из них, то есть \(\displaystyle{\sum_{k=1}^K n_k = N}\), где \(N\) величина генеральной совокупности. Тогда вероятность попасть в одну из групп равняется \(p_k = \frac{n_k}{N}\) – доля людей из \(k\)-й страты в генеральной совокупности.
Пусть наша зависимая переменная равна \(Y\), причем \(\mathbb{E}(Y)=\mu\) и \(var(Y)=\sigma^2\). Тогда среднее значение зависимой переменной равно:
Обычное среднее по всей выборке:\(\displaystyle{\bar{Y}=\frac{1}{N} \sum_{k=1}^K \sum_{j=1}^{n_k} Y_{kj}}\)
Средневзвешенное при стратификации равно сумме средних в каждой страте, взвешенных по вероятностям попасть в каждую из этих страт: \(\displaystyle{\hat{Y}_{\text{strat}}=\sum_{k=1}^K p_k \bar{Y}_k}\), где \(\displaystyle{\bar{Y}_k=\frac{1}{n_k} \sum_{j=1}^{n_k} Y_{kj}}\) среднее значение метрики внутри \(k\)-й страты.
Распишем среднее при стратификации подробнее:
\(\displaystyle{\underbrace{\sum_{k=1}^K p_k \bar{Y}_k}_{\hat{Y}_{\text{strat}}} = \sum_{k=1}^K \frac{n_k}{N} \frac{1}{n_k} \sum_{j=1}^{n_k} Y_{kj} = \underbrace{\frac{1}{N} \sum_{k=1}^K \sum_{j=1}^{n_k} Y_{kj}}_{\bar{Y}}}\) обе средние равны.
Найдем среднее и дисперсию зависимой переменной при стратификации.
- Среднее: \(\displaystyle{\mathbb{E}\left(\hat{Y}_{\text{strat }}\right)=\mathbb{E}\left[\sum_{k=1}^K p_k \bar{Y}_k\right]=\sum_{k=1}^K p_k \mathbb{E}\left(\bar{Y}_k\right)=\sum_{k=1}^K p_k \mu_k=\boxed{\mu}}\)
- Дисперсия: \(\displaystyle{var\left(\hat{Y}_{\text{strat }}\right)=\operatorname{var}\left[\sum_{k=1}^K p_k \bar{Y}_k\right]=\sum_{k=1}^K p_k^2 var\left(\bar{Y}_k\right)=\sum_{k=1}^K \frac{n_k^2}{N^2} \frac{1}{n_k^2} n_k \sigma_k^2 = \frac{1}{N} \sum_{k=1}^K \frac{n_k}{N} \sigma_k^2 = \boxed{\frac{1}{N} \sum_{k=1}^K p_k \sigma_k^2}}\)(1)
4.2 Простая рандомизация (simple random sampling)
Аналогично найдем среднее и дисперсию зависимой переменной при классическом эксперименте.
- Среднее: \(\displaystyle{\mathbb{E}(\bar{Y})=\mathbb{E}\left[\frac{1}{N} \sum_{k=1}^K \sum_{j=1}^{n_k} Y_{k j}\right]=\frac{1}{N} \sum_{k=1}^K \sum_{j=1}^{n_k} \mathbb{E}\left(Y_{k j}\right)=\frac{1}{N} \sum_{k=1}^K \sum_{j=1}^{n_k} \mu = \frac{1}{N} \sum_{k=1}^K n_k \mu = \frac{1}{N} N \mu=\boxed{\mu}}\)
- Дисперсия: \(\displaystyle{\operatorname{var}(\bar{Y})=var\left[\frac{1}{N} \sum_{k=1}^K \sum_{j=1}^{n_k} Y_{kj}\right]= \frac{1}{N^2} \sum_{k=1}^K \sum_{j=1}^{n_k} var\left(Y_{kj}\right) = \frac{1}{N^2} \sum_{k=1}^K n_k \sigma^2 = \frac{N \sigma^2}{N^2}=\boxed{\frac{\sigma^2}{N}}}\)(2)
4.3 Total variance law
Дисперсия зависимой переменной при рандомизированном эксперименте может быть представлена в виде суммы внутригрупповой и межгрупповой дисперсии.
Для этого нам понадобится total variance law (см. доказательство в приложении): \(\displaystyle{var(Y)=var[\mathbb{E}(Y \mid X)] + \mathbb{E}[var(Y\mid X)]}\)
Пусть \(Z\) – номер страты от 1 до K, тогда: \(\displaystyle{var(Y)=\mathbb{E}(var(Y \mid Z))+var(\mathbb{E}(Y \mid Z))=}\)
\(\displaystyle{=\left\{ I(Z = k) \text{ индикаторная переменная, равная 1, если $Z = k$, и равная нулю иначе} \right\}= }\)
\(\displaystyle{=\mathbb{E}\left[\sum_{k=1}^K \sigma_k^2 I(Z=k)\right]+ var\left[\sum_{k=1}^K \mu_k I(Z=k)\right]=}\)
\(\displaystyle{=\sum_{k=1}^K \sigma_k^2 \mathbb{E}[I(Z=k)]+\mathbb{E}\left[\sum_{k=1}^K \mu_k I(Z=k)\right]^2-\left[\mathbb{E}\left[\sum_{k=1}^K \mu_k I(Z=k)\right]\right]^2=}\)
\(\displaystyle{= \sum_{k=1}^K \sigma_k^2 p_k + \sum_{k=1}^K \mu_k^2 p_k - \mu^2 = \{*\} = \sum_{k=1}^K \sigma_k^2 p_k + \sum_{k=1}^K p_k (\mu_k - \mu)^2}\) (3)
\(\displaystyle{(*): \sum_{k=1}^K p_k(\mu_k - \mu)^2 = \sum_{k=1}^K p_k\left(\mu_k^2 - 2\mu\mu_k + \mu^2\right) =}\)
\(\displaystyle{= \sum_{k=1}^K p_k \mu_k^2 - 2\mu \sum_{k=1}^K \mu_k p_k+ \mu^2 \sum_{k=1}^K p_k = \sum_{k=1}^K \mu_k^2 p_k - 2\mu^2 + \mu^2 =\sum_{k=1}^K \mu_k^2 p_k - \mu^2}\)
Из (2) и (3) следует:
\(\displaystyle{var(\bar{Y})=\frac{\sigma^2}{N}}\)
\(\displaystyle{var(Y)=\sum_{k=1}^K \sigma_k^2 p_k+\sum_{k=1}^K p_k\left(\mu_k-\mu\right)^2}\)
\(\displaystyle{var(\bar{Y})= \underbrace{\frac{1}{N} \sum_{k=1}^K p_k \sigma_k^2}_{\text{внутригрупповая дисперсия}} + \underbrace{\frac{1}{N} \sum_{k=1}^K p_k \left(\mu_k-\mu\right)^2}_{\text{межгрупповая дисперсия}}}\) (4)
Из (1) и (4) следует:
\(\displaystyle{var\left(\hat{Y}_{\text{strat}}\right) = \frac{1}{N} \sum_{k=1}^K p_k \sigma_k^2}\)
\(\displaystyle{var(\bar{Y})= \underbrace{\frac{1}{N} \sum_{k=1}^K p_k \sigma_k^2}_{\text{внутригрупповая дисперсия}} + \underbrace{\frac{1}{N} \sum_{k=1}^K p_k \left(\mu_k-\mu\right)^2}_{\text{межгрупповая дисперсия}}}\)
Дисперсия среднего значения зависимой переменной всегда больше, чем дисперсия среднего значения зависимой переменной в случае стратификации, поскольку межгрупповая дисперсия всегда неотрицательная. Таким образом, \(\displaystyle{var(\bar{Y}) \geqslant var\left(\hat{Y}_{\text{strat }}\right)}\)
4.4 Приложение
4.4.1 Условные обозначения
- \(Y\) – зависимая переменная, причем
- \(\mathbb{E}(Y)=\mu\)
- \(var(y)=\sigma^2\)
- Выборка разбита на \(k\) страт по показателю \(X\), то есть
- \(\mu_k\) – среднее в страте
- \(\sigma^2_k\) – дисперсия в страте
- \(n_k\) – численность в страты, то есть \(\sum_{k=1}^K n_k = N\)
- \(p_k = \frac{n_k}{N}\) – доля людей из \(k\)-й страты в генеральной совокупности
- \(Y_{kj}\) – метрика \(j\)-го человека из \(k\)-й страты
- Тогда среднее значение зависимой переменной
- \(\displaystyle{\bar{Y}=\frac{1}{N} \sum_{k=1}^K \sum_{j=1}^{n_k} Y_{kj}}\) обычное среднее
- \(\displaystyle{\hat{Y}_{\text{strat}}=\sum_{k=1}^K p_k \bar{Y}_k}\) среднее при стратификации
- \(\displaystyle{\bar{Y}_k=\frac{1}{n_k} \sum_{j=1}^{n_k} Y_{kj}}\) среднее значение метрики внутри \(k\)-й страты
- \(\displaystyle{\underbrace{\sum_{k=1}^K p_k \bar{Y}_k}_{\hat{Y}_{\text{strat}}} = \sum_{k=1}^K \frac{n_k}{N} \frac{1}{n_k} \sum_{j=1}^{n_k} Y_{kj} = \underbrace{\frac{1}{N} \sum_{k=1}^K \sum_{j=1}^{n_k} Y_{kj}}_{\bar{Y}}}\) обе средние равны
4.4.2 Total variance law
Это вспомогательный факт из математической статистики, который нам понадобится в дальнейших выкладках.
Доказать:
\(\displaystyle{var(Y)=var_X(\mathbb{E}(Y \mid X)) + \mathbb{E}_X(var(yX\mid X))}\)
Доказательство:
\(\displaystyle{var(Y)=\mathbb{E}\left(Y^2\right)-(E(Y))^2 =}\)
\(\displaystyle{= \left\{\text{закон повтороного мат. ожидания } \mathbb{E}(Y) = \mathbb{E}(\mathbb{E}(Y \mid X))\right\} =}\)
\(\displaystyle{=\mathbb{E}\left(\mathbb{E}\left(Y^2 \mid X\right)\right)-\mathbb{E}(\mathbb{E}(Y \mid X))]^2=}\)
\(\displaystyle{=\left\{\text{добавим и вычтем } \mathbb{E}\left[(\mathbb{E}(Y \mid X))^2 \mid X\right] \right\} =}\)
\(\displaystyle{=\underbrace{\mathbb{E}\left[\mathbb{E}\left(Y^2 \mid X\right)-(\mathbb{E}(Y \mid X))^2 \mid X\right]}_{\mathbb{E}[var(Y \mid X)]}+\underbrace{ \mathbb{E}\left[(\mathbb{E}(Y \mid X))^2 \mid X\right]-\mathbb{E}[\mathbb{E}(Y \mid X)] \mathbb{E}[\mathbb{E}(Y \mid X)]}_{var[\mathbb{E}(Y \mid X)]}=}\)
\(\displaystyle{=\mathbb{E}[\operatorname{var}(Y \mid X)]+\operatorname{var}[\mathbb{E}(Y \mid X)]}\)
4.5 Симуляция
В данной симуляции мы попробуем эмпирически доказать, что дисперсия оценки, полученной с помощью престратификации, действительно меньше, чем при оценивании с обычной рандомизацией. Чтобы получить распределение оценок, нам нужно осуществить множество реализаций нашего эксперимента. Для этого мы воспользуемся циклами.
Для начала мы заготовим несколько функций, которые мы далее сможем использовать, чтобы наш код был более компактный. Функция generate_data
будет генерить нам набор данных размером N
наблюдений с параметрами ниже:
<- function(N){
generate_data <- N
N <- runif(N, 5, 28)
X <- rnorm(N, 0, 1)
e <- 1:N
number <- 10 + X + e
Y0 <- Y0 + 7
Y1 <- data.frame(number=number, X=X, Y0=Y0, Y1=Y1)
data return(data)
}
Функция basic_experiment
, ссылаясь на функцию generate_data
, создает набор данных размером rows
наблюдений, проводит на этих данных рандомизацию и считает эффект:
<- function(rows){
basic_experiment <- generate_data(N=rows)
data $T <- rbinom(rows, 1, 0.5)
data$Y <- data$T*data$Y1 + (1-data$T)*data$Y0
data<- lm(Y~T, data)
mod <- summary(mod)$coefficients[2]
ATE return(ATE)
}
Функция stratification_experiment
, ссылаясь на функцию generate_data
, создает набор данных размером rows
наблюдений, затем разбивает его на страты и внутри каждой страты проводит рандомизацию, после чего считает эффект воздействия:
<- function(rows){
stratification_experiment <- generate_data(rows)
data <- data[order(data$X),]
data <- quantile(data$X)
trashhold $group <- cut(data$X, breaks = trashhold,
datainclude.lowest = TRUE, labels = c(1:4))
<- data %>%
data group_by(group) %>%
mutate(1:length(X) %in% sample.int(length(X), length(X)/2))
colnames(data)[6] <- 'T'
$T <- as.numeric(data$T)
data$Y <- data$T*data$Y1 + (1-data$T)*data$Y0
data<- lm(Y~T, data)
mod <- summary(mod)$coefficients[2]
ATE return(ATE)
}
Функция stratification_experiment
в зависимости от аргумента type
проводит симуляцию либо со стратификацией (type='strata'
), либо без нее (type='basic'
). Внутри каждой “ветки” с условием реализуется цикл, который N
раз проводит эксперимент с помощью функции, которую мы написали ранее – basic_experiment
или stratification_experiment
. Каждый раз результаты эксперимента (оценка эффекта) сохраняется в вектор ATEs
.
<- function(N, rows, type){
simulation if (type =='basic'){
<- c()
ATEs =1
iwhile (i<N+1) {
<- basic_experiment(rows)
ATE <- c(ATEs, ATE)
ATEs =i+1
i
} else if (type =='strata'){
} <- c()
ATEs =1
iwhile (i<N+1) {
<- stratification_experiment(rows)
ATE <- c(ATEs, ATE)
ATEs =i+1
i
}
}return(ATEs)
}
Используя функцию simulation
, проводим симуляцию N=10000
раз, каждый раз создавая набор данных из rows=1000
со стратификацией (type='strata'
) и без нее (type='basic'
).
<- simulation(N=10000, rows=1000, type='strata')
stratification_ATEs <- simulation(N=10000, rows=1000, type='basic') basic_ATEs
Построим гистограму, которая покажет нам, как распределены оценки эффекта в зависимости от способа рандомизации.
hist(basic_ATEs, col=rgb(1, 0, 0, 0.5), freq=T)
hist(stratification_ATEs, col=rgb(0, 0, 1, 0.5), freq=T, add=T)
Наш теоретический вывод подтвердился. Действительно, дисперсия оценки, когда мы используем престратификацию, ниже, чем у обычной рандомизации.