R'deki önyükleme gerçekte nasıl çalışır?


22

R'deki boot paketine bakıyordum ve nasıl kullanılacağına dair bazı iyi primerler bulurken, henüz "sahne arkasında" ne olduğunu tam olarak anlatan bir şey bulamadım. Örneğin, bu örnekte , kılavuz standart regresyon katsayılarının bir önyükleme regresyonu için başlangıç ​​noktası olarak nasıl kullanılacağını gösterir, ancak önyükleme regresyon katsayılarını türetmek için önyükleme prosedürünün gerçekte ne yaptığını açıklamaz. Görünen o ki, bir çeşit yinelemeli süreç var ama neler olduğunu tam olarak çözemiyorum.


3
En son açtığımdan beri çok uzun bir süre oldu, bu yüzden sorunuza cevap verip vermeyeceğini bilmiyorum ama açılış paketi özellikle Davison, AC ve Hinkley, DV (1997) 'de ayrıntılı olarak açıklanan yöntemlere dayanıyor. Önyükleme yöntemleri ve uygulamaları. Cambridge: Cambridge Üniversitesi Yayınları. (Referans ayrıca açılış paketinin yardım dosyasında da belirtilmiştir .)
Gala

Yanıtlar:


34

Birkaç "lezzet" veya önyükleme formları vardır (örneğin, parametrik olmayan, parametrik, artık yeniden örnekleme ve daha fazlası). Örnekteki önyükleme parametrik olmayan önyükleme veya durum örneklemesi olarak adlandırılır ( regresyondaki uygulamalar için buraya , buraya , buraya ve buraya bakın). Temel fikir, numunenize popülasyon gibi davranmanız ve tekrar tekrar yerine yeni numuneler almanızdır . Tüm orijinal gözlemlerin yeni numuneye alınma olasılığı eşit. Sonra, ilgilendiğiniz istatistikleri hesaplar ve saklarsınız, bu yeni çizilen örneği kullanarak ortalama, medyan veya regresyon katsayıları olabilir.. Bu kere tekrar edilir . Her yinelemede, orijinal numunenizden bazı gözlemler birkaç kez çizilirken, bazı gözlemler hiç çizilmeyebilir. Sonra tekrarlamalar, sen gelmiş ilgi istatistiği (ler) in önyükleme tahminleri saklanan (örneğin eğer ve ilgi istatistik ortalamaları, sen ortalama 1000 bootstrapped tahminleri var). Son olarak, ortalama, medyan ve bootstrap-tahminlerinin standart sapması gibi özet istatistikler hesaplanır.n n n = 1000 nnnnn=1000n

Önyükleme çoğu zaman için kullanılır:

  1. Güven aralıklarının hesaplanması (ve standart hataların tahmin edilmesi)
  2. Nokta tahminlerinin yanlılığının tahmini

Bootstrap örneklerine dayanarak güven aralıklarını hesaplamak için birkaç yöntem vardır ( bu makale açıklama ve rehberlik sağlar). % 95'lik bir güvenirlik aralığını hesaplamak için çok basit bir yöntem, sadece önyükleme numunelerinin ampirik 2.5 ve 97.5. Yüzdeliklerini hesaplamaktır (bu aralık önyükleme yüzdelik aralığı olarak adlandırılır ; aşağıdaki koda bakınız). Eğilim düzeltmeli ve hızlandırılmış önyükleme (BCa) gibi daha iyi yöntemler olduğu için basit yüzdelik aralık yöntemi nadiren pratikte kullanılır. BCa aralıkları, önyükleme dağılımındaki hem önyargı hem de çarpıklık için ayarlanır.

Eğilim , sadece ortalama arasındaki fark olarak tahmin edilmektedir depolanan önyükleme örnekleri ve orijinal tahminini (ler).n

Örneği web sitesinden kopyalayalım, ancak yukarıda özetlediğim fikirleri içeren kendi döngümüzü kullanarak (değiştirerek tekrar tekrar çizerek):

#-----------------------------------------------------------------------------
# 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")

Ve işte özet tablomuz:

#-----------------------------------------------------------------------------
# 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

Bazı açıklamalar

  • Önyükleme tahminlerinin ortalaması ile orijinal tahminler arasındaki fark, çıktıdaki "önyargı" olarak adlandırılan şeydir. boot
  • boot"Std. Error" ifadesinin çıktısı , bootstrapped tahminlerinin standart sapmasıdır.

Çıktı ile karşılaştırın 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

"Önyargı" sütunlarını ve "std. Error" ifadesini kendi özet tablomuzun "sd" sütunu ile karşılaştırın. % 95 güvence aralıklarımız boot.ci, yüzdelik yöntem kullanılarak hesaplanan güven aralıklarına çok benzer (yine de: endeks 9 ile parametrenin alt sınırına bakın).


Detaylı cevap için teşekkürler. Temel olarak katsayıların, oluşturulan 2000 katsayı kümesinin ortalaması olduğunu mu söylüyorsunuz?
zgall1

4
t

'Temel fikir, numunenize popülasyon gibi davranmanız ve tekrar tekrar yerine yeni numuneler almanızdır' - yeni numunelerin boyutunun ne olduğu nasıl belirlenir?
Sinusx

1
@Sinusx Normalde, orijinal örnekle aynı büyüklükteki örnekleri çizersiniz. Önemli olan, numuneyi yerine koymaktır. Bu nedenle, orijinal örnekten bazı değerler birden çok kez çizilir ve bazı değerler hiç olmaz.
COOLSerdash

6

boot"İstatistik" parametresi olarak iletilen işleve odaklanmalı ve nasıl yapıldığına dikkat etmelisiniz .

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" argümanı tüm veri çerçevesini alacak, ancak "i" argümanı "boot" tarafından üretilen ve 1: NROW (data) 'dan alınan bir satır endeksi örneği alacak. Bu koddan görebileceğiniz gibi, daha sonra "i", geçirilen bir neo-örnek oluşturmak için kullanılır zeroinlve ardından sonuçlarının yalnızca seçilen bölümleri döndürülür.

"İ" nin {1,2,3,3,3,6,7,7,10} olduğunu hayal edelim. "[" Fonksiyonu sadece bir temel oluşturacaktır satır 3 ile 3 kopya ve satırın 7. 2 kopya yalnızca bu satır döndürür zeroinl()hesaplama ve daha sonra katsayıları geri gönderilir boot, işlemin bu tekrarlı olarak sonuç olarak. Bu tür kopyaların sayısı "R" parametresi ile kontrol edilir.

statisticBu durumda sadece regresyon katsayılarından geri döndürüldüğünden , bootişlev bu birikmiş katsayıları "t" değeri olarak döndürür. Diğer önyükleme paketi işlevleriyle daha fazla karşılaştırma yapılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.