Настройте стратегию стратифицированной выборки в загрузочном пакете

Я пытаюсь получить загрузочные SE для коэффициентов регрессии. Используемые данные выглядят так:

set.seed(1234)
df <- data.frame(y = rnorm(1:30), 
             fac1 = as.factor(sample(c("A","B","C","D","E"),30, replace = T)),
             fac2 = as.factor(sample(c("NY","NC","CA"),30,replace = T)),
             x = rnorm(1:30))

Я использую пакет boot для выполнения начальной загрузки:

library(boot)
fun <- function(data, index){
    data <- df[index,]
    reg <- lm(y ~ fac1 + fac2 + x, data)
    coef(reg)
}
test.boot <- boot(df, fun, strata = df$fac1, 100)

Однако R жалуется:

Error in boot(df, fun, strata = df$fac1, 100) : 
number of items to replace is not a multiple of replacement length

Моя ситуация точно такая же, как указано здесь. Я понимаю, что проблема здесь в недостаточном количестве наблюдений в каждой группе. Опция strata в пакете boot может работать только для одной факторной переменной. В моем случае я должен стратифицировать образцы на основе двух факторов: fac1 и fac2 (пожалуйста, дайте мне знать, если мое понимание здесь неверно).

Я обнаружил, что функция stratified, опубликованная здесь, может создавать точные стратифицированные выборки, как мне нужно. Проблема здесь в том, как я могу реализовать функцию stratified для функции boot и позволить функции boot работать с правильными образцами?

В настоящее время я сам пишу for-loop для запуска начальной загрузки с использованием правильных стратифицированных образцов. Но я все еще хочу знать, могу ли я включить функцию stratified в boot? Какие-либо предложения? Благодарю вас!


person Chuan    schedule 30.08.2016    source источник
comment
См. help("interaction") для создания одного фактора из двух факторов.   -  person lmo    schedule 30.08.2016
comment
Спасибо @lmao. Я думаю, что использование взаимодействия — определенно хороший способ решить поставленный выше вопрос. Мне все еще интересно, могу ли я включить другие настраиваемые функции, такие как stratified, упомянутые здесь, в boot, поскольку мне могут понадобиться дополнительные функции, предоставляемые stratified для более сложных ситуаций. Спасибо!   -  person Chuan    schedule 30.08.2016


Ответы (1)


После тщательного анализа пакета boot я думаю, что нашел решение своего вопроса без изменения исходного кода boot. На самом деле, boot позволяет пользователю настраивать свою стратегию выборки. Проверьте параметры sim = "parametric" и ran.gen в help(boot).

Итак, что касается моего случая, я могу просто указать функцию ran.gen для вложения функции stratified и использовать ее для регенерации образцов для начальной загрузки.

fun <- function(data){
            reg <- lm(y ~ fac1 + fac2 + x, data)
            coef(reg)}

rgen <- function(df,stratified){
        #code of stratified goes here and other specifications ... }

test.boot <- boot(df, fun, 1000, sim = "parametric", ran.gen = rgen)

Готово!

person Chuan    schedule 01.09.2016