R BootStrap со стратами - PullRequest
       66

R BootStrap со стратами

0 голосов
/ 30 мая 2020

Я научился делать bootstrap регрессию. Вот мой пример и код.

   library(boot)
    sampledata = data.frame(y = sample(0:20, r = T, size = 5000),
                            x1 = runif(5000),
                            x2 = runif(5000),
                            group1 = sample(1:3, r = T, size = 5000),
                            group2 = sample(0:1, r = T, size = 5000))


# function to obtain R-Squared from the data
rsq <- function(formula, data, indices) {
  d <- data[indices,] 
  fit <- lm(formula, data=d)
  return(coef(fit))
}

# bootstrapping with 250 replications
results <- boot(data=sampledata, statistic=rsq,
   R=250, formula=y~x1+x2)
df <- data.frame(results$t)
names(df) <- names(results$t0)

Однако, если вы хотите проделать этот процесс для подгрупп ваших данных, как вы можете сделать его более автоматизированным? Это то, что я надеюсь сделать, но это очень утомительно, и у меня есть еще много групповых категорий, но в основном это обнадеживающий результат, в основном я разбиваю образцы данных на 6 групп, а затем использую все эти наборы данных по отдельности в 6 разных bootstrap моделях а затем объедините результаты в ДАННЫЕ. Я вижу, что в загрузке есть функция страты, но я не могу заставить ее работать. Также вы должны разделить свои данные на группы, а затем выполнить образец bootstrap? Или получить образец bootstrap, а затем подгруппировать свои данные? В любом случае, мне интересно, как можно сделать это более автоматическим c, когда я могу закодировать программу для выполнения оценки bootstrap для всех групп отдельно, где модели расслоены.

sampledata1 = subset(sampledata, group1 == 1 & group2 == 0)
sampledata2 = subset(sampledata, group1 == 2 & group2 == 0)
sampledata3 = subset(sampledata, group1 == 3 & group2 == 0)
sampledata4 = subset(sampledata, group1 == 1 & group2 == 1)
sampledata5 = subset(sampledata, group1 == 2 & group2 == 1)
sampledata6 = subset(sampledata, group1 == 3 & group2 == 1)



# bootstrapping with 250 replications
results <- boot(data=sampledata1, statistic=rsq,
   R=250, formula=y~x1+x2)
df1 <- data.frame(results$t)
names(df1) <- names(results$t0)
df1$group1 = 1
df1$group2 = 0

# bootstrapping with 250 replications
results <- boot(data=sampledata2, statistic=rsq,
   R=250, formula=y~x1+x2)
df2 <- data.frame(results$t)
names(df2) <- names(results$t0)
df2$group1 = 2
df2$group2 = 0

# bootstrapping with 250 replications
results <- boot(data=sampledata3, statistic=rsq,
   R=250, formula=y~x1+x2)
df3 <- data.frame(results$t)
names(df3) <- names(results$t0)
df3$group1 = 3
df3$group2 = 0

# bootstrapping with 250 replications
results <- boot(data=sampledata4, statistic=rsq,
   R=250, formula=y~x1+x2)
df4 <- data.frame(results$t)
names(df4) <- names(results$t0)
df4$group1 = 1
df4$group2 = 1

# bootstrapping with 250 replications
results <- boot(data=sampledata5, statistic=rsq,
   R=250, formula=y~x1+x2)
df5 <- data.frame(results$t)
names(df5) <- names(results$t0)
df5$group1 = 2
df5$group2 = 1

# bootstrapping with 250 replications
results <- boot(data=sampledata6, statistic=rsq,
   R=250, formula=y~x1+x2)
df6 <- data.frame(results$t)
names(df6) <- names(results$t0)
df6$group1 = 3
df6$group2 = 1

DATA = rbind(df1, df2, df3, df4, df5, df6)

rsq <- function(formula, data, indices) {
  dataSUB <- data %>% filter(GROUP1 == group1, GROUP2 == group2)
  d <- dataSUB[indices,] 
  fit <- lm(formula, data=d)
  return(coef(fit))
}

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Использование data.table может не увеличить время выполнения. Однако вот аналогичная альтернатива с data.table и вспомогательной функцией для обобщения процесса:

library(data.table)

setDT(sampledata)

boot_group <- function(sel_group1, sel_group2){
  sampledata1  <- sampledata[group1 == sel_group1 & group2 == sel_group2]
  results <- boot(data=sampledata1, statistic=rsq,
                  R=250, formula=y~x1+x2)
  df1 <- data.table(results$t)
  names(df1) <- names(results$t0)
  df1[, group1 := sel_group1]
  df1[, group2 := sel_group2]
  return(df1)
}

DATA <- data.table()
groups1 <- sampledata[, unique(group1)]
groups1 <- sort(groups1)
groups2 <- sampledata[, unique(group2)]
groups2 <- sort(groups2)

for (g2 in groups2) {
  for (g1 in groups1) {
    subdf <- boot_group(g1, g2)
    DATA <- rbind(DATA, subdf)
  }
}
1 голос
/ 30 мая 2020

Это должно сработать:

set1 <- c(1,2,3)
set2 <- c(0,1)
for(i in set1) {
    for(j in set2) {
        sampleDataSet = subset(sampledata, group1 == i & group2 == j)
        results <- boot(data=sampleDataSet, statistic=rsq, R=250, formula=y~x1+x2)
        df <- data.frame(results$t)
        names(df) <- names(results$t0)
        df$group1 = i
        df$group2 = j
        assign(paste("df",i+(j*length(set1)),sep=""), df)
    }
}

Примечание: если вы планируете сделать это с большими группами, предполагая, что 0 всегда находится в set2, вы можете просто обновить set1 и set2 и схема именования должна продолжать работать.

Надеюсь, это поможет!

...