Як реально працює завантажувальна програма в R?


22

Я заглядав у завантажувальний пакет у R, і, хоча знайшов чимало хороших праймерів, як ним користуватися, я ще не знайшов нічого, що б точно описувало, що відбувається "поза кадром". Наприклад, у цьому прикладі посібник показує, як використовувати стандартні коефіцієнти регресії як вихідну точку для регресії завантажувальної стрічки, але не пояснює, що насправді робить процедура завантаження для отримання коефіцієнтів регресії завантажувальної стрічки. Здається, відбувається якийсь ітераційний процес, який відбувається, але я не можу зрозуміти, що саме відбувається.


3
З давніх пір я його відкрив, тому не знаю, чи відповість на ваше запитання, але пакет завантаження базується, зокрема, на методах, детально описаних у Davison, AC, & Hinkley, DV (1997). Методи завантаження та їх застосування. Кембридж: Кембриджський університетський прес. (Посилання також цитується у файлі довідки для завантажувального пакету.)
Гала

Відповіді:


34

Існує кілька "ароматів" або форм завантажувального пристрою (наприклад, непараметричні, параметричні, залишкові перестановки та багато іншого). Завантажувальний пристрій у прикладі називається непараметричним завантажувальним завантаженням або рекемпізацією випадків (див. Тут , тут , тут і тут для застосувань у регресії). Основна ідея полягає в тому, що ви ставитеся до свого зразка як до сукупності та неодноразово малюєте з нього нові зразки із заміною . Усі оригінальні спостереження мають однакову ймовірність залучення до нового зразка. Тоді ви обчислюєте та зберігаєте статистику (и), що цікавить, це може бути середнє значення, коефіцієнти медіани або регресії за допомогою щойно складеної вибірки. Це повторюється разів. Під час кожної ітерації деякі спостереження з вашої оригінальної вибірки малюються кілька разів, тоді як деякі спостереження можуть бути взагалі не намальовані. Після n ітерацій у вас є n збережених оцінок завантажувальної статистики статистичних даних, що представляють інтерес (наприклад, якщо n = 1000, а статистика інтересу - це середнє значення, у вас є 1000 завантажених оцінок середнього значення). Нарешті, обчислюються підсумкові статистичні дані, такі як середнє значення, медіана та стандартне відхилення n оцінок завантаження.нннн=1000н

Завантаження даних часто використовується для:

  1. Розрахунок довірчих інтервалів (і оцінка стандартних помилок)
  2. Оцінка зміщення бальних оцінок

Існує кілька методів обчислення довірчих інтервалів на основі зразків завантажувальної програми ( ця стаття надає пояснення та вказівки). Один дуже простий метод обчислення інтервалу впевненості 95% - це просто обчислення емпіричних 2,5-го та 97,5-го відсотків проб завантажувального завантаження (цей інтервал називається інтервалом завантажувального періоду, див. Код нижче). Простий метод перцентильного інтервалу рідко застосовується на практиці, оскільки існують кращі методи, такі як корекція зміщення та прискорений завантажувальний пристрій (BCa). Інтервали BCa регулюються як для зміщення, так і для косості в розподілі завантажувача.

н

Давайте повторимо приклад з веб-сайту, але використовуючи наш власний цикл, що містить ідеї, які я окреслював вище (повторно малюючи із заміною):

#-----------------------------------------------------------------------------
# Load packages
#-----------------------------------------------------------------------------

require(ggplot2)
require(pscl)
require(MASS)
require(boot)

#-----------------------------------------------------------------------------
# Load data
#-----------------------------------------------------------------------------

zinb <- read.csv("http://www.ats.ucla.edu/stat/data/fish.csv")
zinb <- within(zinb, {
  nofish <- factor(nofish)
  livebait <- factor(livebait)
  camper <- factor(camper)
})

#-----------------------------------------------------------------------------
# Calculate zero-inflated regression
#-----------------------------------------------------------------------------

m1 <- zeroinfl(count ~ child + camper | persons, data = zinb,
               dist = "negbin", EM = TRUE)

#-----------------------------------------------------------------------------
# Store the original regression coefficients
#-----------------------------------------------------------------------------

original.estimates <- as.vector(t(do.call(rbind, coef(summary(m1)))[, 1:2]))

#-----------------------------------------------------------------------------
# Set the number of replications
#-----------------------------------------------------------------------------

n.sim <- 2000

#-----------------------------------------------------------------------------
# Set up a matrix to store the results
#-----------------------------------------------------------------------------

store.matrix <- matrix(NA, nrow=n.sim, ncol=12)

#-----------------------------------------------------------------------------
# The loop
#-----------------------------------------------------------------------------

set.seed(123)

for(i in 1:n.sim) {

  #-----------------------------------------------------------------------------
  # Draw the observations WITH replacement
  #-----------------------------------------------------------------------------

  data.new <- zinb[sample(1:dim(zinb)[1], dim(zinb)[1], replace=TRUE),]

  #-----------------------------------------------------------------------------
  # Calculate the model with this "new" data
  #-----------------------------------------------------------------------------

  m <- zeroinfl(count ~ child + camper | persons,
                data = data.new, dist = "negbin",
                start = list(count = c(1.3711, -1.5152, 0.879),
                             zero = c(1.6028, -1.6663)))

  #-----------------------------------------------------------------------------
  # Store the results
  #-----------------------------------------------------------------------------

  store.matrix[i, ] <- as.vector(t(do.call(rbind, coef(summary(m)))[, 1:2]))

}


#-----------------------------------------------------------------------------
# Save the means, medians and SDs of the bootstrapped statistics
#-----------------------------------------------------------------------------

boot.means <- colMeans(store.matrix, na.rm=T)

boot.medians <- apply(store.matrix,2,median, na.rm=T)

boot.sds <- apply(store.matrix,2,sd, na.rm=T)

#-----------------------------------------------------------------------------
# The bootstrap bias is the difference between the mean bootstrap estimates
# and the original estimates
#-----------------------------------------------------------------------------

boot.bias <- colMeans(store.matrix, na.rm=T) - original.estimates

#-----------------------------------------------------------------------------
# Basic bootstrap CIs based on the empirical quantiles
#-----------------------------------------------------------------------------

conf.mat <- matrix(apply(store.matrix, 2 ,quantile, c(0.025, 0.975), na.rm=T),
ncol=2, byrow=TRUE)
colnames(conf.mat) <- c("95%-CI Lower", "95%-CI Upper")

І ось наша підсумкова таблиця:

#-----------------------------------------------------------------------------
# Set up summary data frame
#-----------------------------------------------------------------------------

summary.frame <- data.frame(mean=boot.means, median=boot.medians,
sd=boot.sds, bias=boot.bias, "CI_lower"=conf.mat[,1], "CI_upper"=conf.mat[,2])

summary.frame

      mean  median       sd       bias CI_lower CI_upper
1   1.2998  1.3013  0.39674 -0.0712912  0.51960   2.0605
2   0.2527  0.2486  0.03208 -0.0034461  0.19898   0.3229
3  -1.5662 -1.5572  0.26220 -0.0509239 -2.12900  -1.0920
4   0.2005  0.1986  0.01949  0.0049019  0.16744   0.2418
5   0.9544  0.9252  0.48915  0.0753405  0.03493   1.9025
6   0.2702  0.2688  0.02043  0.0009583  0.23272   0.3137
7  -0.8997 -0.9082  0.22174  0.0856793 -1.30664  -0.4380
8   0.1789  0.1781  0.01667  0.0029513  0.14494   0.2140
9   2.0683  1.7719  1.59102  0.4654898  0.44150   8.0471
10  4.0209  0.8270 13.23434  3.1845710  0.58114  57.6417
11 -2.0969 -1.6717  1.56311 -0.4306844 -8.43440  -1.1156
12  3.8660  0.6435 13.27525  3.1870642  0.33631  57.6062

Деякі пояснення

  • Різниця між середнім значенням завантажувальної програми та початковими оцінками - це те, що називається "упередженням" на виході boot
  • Висновок bootвиклику "std. Помилка" - це стандартне відхилення завантажених оцінок

Порівняйте його з результатом boot:

#-----------------------------------------------------------------------------
# Compare with boot output and confidence intervals
#-----------------------------------------------------------------------------

set.seed(10)
res <- boot(zinb, f, R = 2000, parallel = "snow", ncpus = 4)

res

Bootstrap Statistics :
       original       bias    std. error
t1*   1.3710504 -0.076735010  0.39842905
t2*   0.2561136 -0.003127401  0.03172301
t3*  -1.5152609 -0.064110745  0.26554358
t4*   0.1955916  0.005819378  0.01933571
t5*   0.8790522  0.083866901  0.49476780
t6*   0.2692734  0.001475496  0.01957823
t7*  -0.9853566  0.083186595  0.22384444
t8*   0.1759504  0.002507872  0.01648298
t9*   1.6031354  0.482973831  1.58603356
t10*  0.8365225  3.240981223 13.86307093
t11* -1.6665917 -0.453059768  1.55143344
t12*  0.6793077  3.247826469 13.90167954

perc.cis <- matrix(NA, nrow=dim(res$t)[2], ncol=2)
    for( i in 1:dim(res$t)[2] ) {
  perc.cis[i,] <- boot.ci(res, conf=0.95, type="perc", index=i)$percent[4:5] 
}
colnames(perc.cis) <- c("95%-CI Lower", "95%-CI Upper")

perc.cis 

      95%-CI Lower 95%-CI Upper
 [1,]      0.52240       2.1035
 [2,]      0.19984       0.3220
 [3,]     -2.12820      -1.1012
 [4,]      0.16754       0.2430
 [5,]      0.04817       1.9084
 [6,]      0.23401       0.3124
 [7,]     -1.29964      -0.4314
 [8,]      0.14517       0.2149
 [9,]      0.29993       8.0463
[10,]      0.57248      56.6710
[11,]     -8.64798      -1.1088
[12,]      0.33048      56.6702

#-----------------------------------------------------------------------------
# Our summary table
#-----------------------------------------------------------------------------

summary.frame

      mean  median       sd       bias CI_lower CI_upper
1   1.2998  1.3013  0.39674 -0.0712912  0.51960   2.0605
2   0.2527  0.2486  0.03208 -0.0034461  0.19898   0.3229
3  -1.5662 -1.5572  0.26220 -0.0509239 -2.12900  -1.0920
4   0.2005  0.1986  0.01949  0.0049019  0.16744   0.2418
5   0.9544  0.9252  0.48915  0.0753405  0.03493   1.9025
6   0.2702  0.2688  0.02043  0.0009583  0.23272   0.3137
7  -0.8997 -0.9082  0.22174  0.0856793 -1.30664  -0.4380
8   0.1789  0.1781  0.01667  0.0029513  0.14494   0.2140
9   2.0683  1.7719  1.59102  0.4654898  0.44150   8.0471
10  4.0209  0.8270 13.23434  3.1845710  0.58114  57.6417
11 -2.0969 -1.6717  1.56311 -0.4306844 -8.43440  -1.1156
12  3.8660  0.6435 13.27525  3.1870642  0.33631  57.6062

Порівняйте стовпці "зміщення" та "std. Помилка" зі стовпцем "sd" нашої власної підсумкової таблиці. Наші інтервали 95-процентної впевненості дуже схожі на довірчі інтервали, обчислені за boot.ciдопомогою методу перцентиля (проте, не все: подивіться нижню межу параметра з індексом 9).


Дякуємо за детальну відповідь. Ви в основному говорите, що коефіцієнти - це середнє значення для 2000 наборів коефіцієнтів?
zgall1

4
@ zgall1 Так, в основному (або медіани). Але найчастіше точкові оцінки менш зацікавлені у завантаженні. Часто причиною використання завантажувальної програми є пошук довірчих інтервалів, які враховують розподіл вибірки та не передбачають будь-якого розподілу (наприклад, нормального). Таким чином, довірчі інтервали завантаженості часто бувають асимметричними, тоді як довірчі інтервали засновані на нормальній абот-розподіл симетричний.
COOLSerdash

"Основна ідея полягає в тому, що ви ставитеся до свого зразка як до сукупності і повторно малюєте з нього нові зразки заміною" - як визначити, який розмір нових зразків?
Синус

1
@Sinusx Зазвичай ви малюєте зразки такого ж розміру, що і оригінальний зразок. Важлива ідея полягає в тому, щоб зробити зразок із заміною. Таким чином, деякі значення з початкового зразка будуть малюватися кілька разів, а деякі - зовсім.
COOLSerdash

6

Ви повинні зосередитись на функції, переданій bootяк "статистичний" параметр, і помітити, як вона побудована.

f <- function(data, i) {
  require(pscl)
  m <- zeroinfl(count ~ child + camper | persons,
    data = data[i, ], dist = "negbin",
    start = list(count = c(1.3711, -1.5152, 0.879), zero = c(1.6028, -1.6663)))
  as.vector(t(do.call(rbind, coef(summary(m)))[, 1:2]))
}

Аргумент "data" отримає весь кадр даних, але аргумент "i" отримає зразок індексів рядків, що генеруються "boot" і взяті з 1: NROW (data). Як видно з цього коду, "i" потім використовується для створення нео-зразка, який передаєтьсяzeroinl а потім повертаються лише вибрані частини його результатів.

Уявімо, що "i" дорівнює {1,2,3,3,3,6,7,7,10}. Функція "[" поверне лише ті рядки з 3 копіями рядка 3 та 2 копіями рядка 7. Це буде основою для одногоzeroinl() обчислення, і тоді повертаються коефіцієнти bootяк результат цієї процесу. Кількість таких повторів контролюється параметром "R".

Оскільки statisticу цьому випадку повертаються лише коефіцієнти регресії , bootфункція повертає ці накопичені коефіцієнти як значення "t". Подальші порівняння можуть виконуватися іншими функціями завантажувального пакета.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.