Saddlepoint yaklaşımı nasıl çalışır?


Yanıtlar:


47

Olasılık yoğunluk fonksiyonuna saddlepoint yaklaşımı (kütle fonksiyonları için aynı şekilde çalışır, ancak burada sadece yoğunluklar hakkında konuşacağım), merkezi limit teoreminde bir inceltme olarak görülebilen şaşırtıcı derecede iyi çalışan bir yaklaşımdır. Dolayısıyla, yalnızca merkezi bir limit teoreminin olduğu ortamlarda çalışacaktır, ancak daha güçlü varsayımlara ihtiyacı vardır.

Moment oluşturma fonksiyonunun var olduğu ve iki kez farklılaştığı varsayımıyla başlarız. Bu, özellikle tüm anların var olduğu anlamına gelir. moment oluşturma işleviyle (mgf) ve cgf (kümülatör oluşturma işlevi) ile rastgele bir değişken olsun (burada , doğal logaritmayı belirtir). Gelişimde Ronald W Butler'ı yakından takip edeceğim: "Uygulamalarla Saddlepoint Yaklaşımları" (CUP). Belli bir integrali Laplace yaklaşımını kullanarak saddlepoint yaklaşımını geliştireceğiz. Yazmak X

M(t)=EetX
K(t)=logM(t)log
eK(t)=etxf(x)dx=exp(tx+logf(x))dx=exp(h(t,x))dx
burada . Şimdi Taylor genişleyecektir içinde dikkate bir sabite olarak. Bu verir ' x'e göre farklılaşmayı ifade eder . Not bu h (t, x) = - t \ frac {\ kısmi} {\ kısmi x} \ log f (x) \\ s '(t, x) = - {kısmi \ ^ 2} \ frac {\ partial x ^ 2} \ log f (x)> 0 (yaklaşımın çalışması için gerekli olduğu gibi varsayımla son eşitsizlik). X_t olsunh(t,x)=txlogf(x)h(t,x)xt
h(t,x)=h(t,x0)+h(t,x0)(xx0)+12h(t,x0)(xx0)2+
x
h(t,x)=txlogf(x)h(t,x)=2x2logf(x)>0
xth(t,xt)=0 için çözüm olun . Bunun için en az verdiğini üstlenecek h(t,x) bir fonksiyonu olarak x . İntegralde bu genişlemeyi kullanmak ve bölümünü unutmak ,
eK(t)exp(h(t,xt)12h(t,xt)(xxt)2)dx=eh(t,xt)e12h(t,xt)(xxt)2dx
Gauss integrali olan dx ,
eK(t)eh(t,xt)2πh(t,xt).
Bu, saddlepoint yaklaşımının (ilk versiyonunu)
(*)f(xt)h(t,xt)2πexp(K(t)txt)
Yaklaşımın üstel bir aile şeklinde olduğuna dikkat edin.

Şimdi bunu daha faydalı bir biçimde elde etmek için bazı işler yapmamız gerekiyor.

Kaynaktan , biz olsun İle ilgili olarak bu Farklılaşan verir (bizim varsayımlarla) ve arasındaki ilişki monotondur, bu nedenle iyi tanımlanmıştır. Biz bir yaklaşma ihtiyaç . Bu amaçla,h(t,xt)=0

t=xtlogf(xt).
xt
txt=2xt2logf(xt)>0
txtxtxtlogf(xt)(*)
(**)logf(xt)=K(t)txt12log2π2xt2logf(xt).
Sadece yukarıda geçen dönem üzerinde zayıf bağlıdır varsayarsak göre onun türevi bu yüzden, yaklaşık sıfırdır, biz olsun (biz bu konuda yorumun geri gelecektir) Bu yaklaşıma kadar, o zaman böylece ve , denklemiyle , saddlepoint denklemi olarak adlandırılır. xtxt
logf(xt)xt(K(t)xt)txtt
0t+logf(xt)xt=(K(t)xt)txt
txt
(§)K(t)xt=0,

Ne belirlenmesinde hemen kaçırma olduğunu ve saddlepoint denkleminin örtük olarak farklılaşması ile bulabildiğimizi : Sonuç (yukarı eden yaklaşım kadar) Her şeyi birleştirme biz yoğunluk nihai saddlepoint yaklaşım vardır olarak (*)

h(t,xt)=2logf(xt)xt2=xt(logf(xt)xt)=xt(t)=(xtt)1
K(t)=xt
xtt=K(t).
h(t,xt)=1K(t)
f(x)
f(xt)eK(t)txt12πK(t).
Şimdi, belirli bir noktasında yoğunluğunu yaklaşmak için, pratikte bu kullanmak bunun için biz saddlepoint denklemini çözmek bulmak için .xtxtt

Saddlepoint yaklaşımı sık sık göre ortalama yoğunluğu bir yaklaşım olarak belirtilmektedir IID gözlem . Ortalamanın kümülatif üretme işlevi basitçe , bu nedenle ortalamanın saddlepoint yaklaşımı nX1,X2,,XnnK(t)

f(x¯t)=enK(t)ntx¯tn2πK(t)

İlk örneğe bakalım. Standart normal yoğunluğa yaklaşmaya çalışırsak ne elde ederiz? mgf böylece böylece saddlepoint denklemi ve saddlepoint yaklaşımı değerini verir yani bu durumda yaklaşıklık kesindir.

f(x)=12πe12x2
M(t)=exp(12t2)
K(t)=12t2K(t)=tK(t)=1
t=xt
f(xt)e12t2txt12π1=12πe12xt2

Çok farklı bir uygulamaya bakalım: Dönüşüm alanındaki bootstrap, ortalamanın bootstrap dağılımına saddlepoint yaklaşımını kullanarak analitik olarak bootstrapping yapabiliriz!

Bazı yoğunluktan dağıtılmış X_n sahip olduğumuzu varsayalım (benzetilen örnekte bir üstel dağılım kullanacağız). Örnekten, ve sonra ampirik cgf kullanarak deneysel momenti üreten işlevi hesapladık. . Biz bir ortalama ampirik MGF mi , ortalama ampirik KGF saddlepoint yaklaşımı oluşturmak için kullandığımız . Aşağıdaki bazı R kodlarında (R sürüm 3.2.3): X1,X2,,Xnf

M^(t)=1ni=1netxi
K^(t)=logM^(t)log(M^(t/n)n)
K^X¯(t)=nlogM^(t/n)

set.seed(1234)
x  <-  rexp(10)

require(Deriv)   ### From CRAN
drule[["sexpmean"]]   <-  alist(t=sexpmean1(t))  # adding diff rules to 
                                                 # Deriv
drule[["sexpmean1"]]  <-  alist(t=sexpmean2(t))

###

make_ecgf_mean  <-   function(x)   {
    n  <-  length(x)
    sexpmean  <-  function(t) mean(exp(t*x))
    sexpmean1 <-  function(t) mean(x*exp(t*x))
    sexpmean2 <-  function(t) mean(x*x*exp(t*x))
    emgf  <-  function(t) sexpmean(t)
    ecgf  <-   function(t)  n * log( emgf(t/n) )
    ecgf1 <-   Deriv(ecgf)
    ecgf2 <-   Deriv(ecgf1)
    return( list(ecgf=Vectorize(ecgf),
                 ecgf1=Vectorize(ecgf1),
                 ecgf2 =Vectorize(ecgf2) )    )
}

### Now we need a function solving the saddlepoint equation and constructing
### the approximation:
###

make_spa <-  function(cumgenfun_list) {
    K  <- cumgenfun_list[[1]]
    K1 <- cumgenfun_list[[2]]
    K2 <- cumgenfun_list[[3]]
    # local function for solving the speq:
    solve_speq  <-  function(x) {
          # Returns saddle point!
          uniroot(function(s) K1(s)-x,lower=-100,
                  upper = 100, 
                  extendInt = "yes")$root
}
    # Function finding fhat for one specific x:
    fhat0  <- function(x) {
        # Solve saddlepoint equation:
        s  <-  solve_speq(x)
        # Calculating saddlepoint density value:
        (1/sqrt(2*pi*K2(s)))*exp(K(s)-s*x)
    }
    # Returning a vectorized version:
    return(Vectorize(fhat0))
} #end make_fhat

(Bunu diğer cgfs'ler için kolayca değiştirilebilen genel kod olarak yazmaya çalıştım, ancak kod hala çok sağlam değil ...)

Daha sonra bunu, bir birim üstel dağılımından on bağımsız gözlem örneği için kullanırız. Her zamanki parametrik olmayan önyükleme işlemini "el ile" yaparız, sonuçta ortaya çıkan önyükleme histogramını çizeriz ve saddlepoint yaklaşımının üzerine çizeriz:

> ECGF  <- make_ecgf_mean(x)
> fhat  <-  make_spa(ECGF)
> fhat
function (x) 
{
    args <- lapply(as.list(match.call())[-1L], eval, parent.frame())
    names <- if (is.null(names(args))) 
        character(length(args))
    else names(args)
    dovec <- names %in% vectorize.args
    do.call("mapply", c(FUN = FUN, args[dovec], MoreArgs = list(args[!dovec]), 
        SIMPLIFY = SIMPLIFY, USE.NAMES = USE.NAMES))
}
<environment: 0x4e5a598>
> boots  <-  replicate(10000, mean(sample(x, length(x), replace=TRUE)), simplify=TRUE)
> boots  <-  replicate(10000, mean(sample(x, length(x), replace=TRUE)), simplify=TRUE)
> hist(boots, prob=TRUE)
> plot(fhat, from=0.001, to=2, col="red", add=TRUE)

Ortaya çıkan arsa verilmesi:

bootstrap dağılımının saddlepoint yaklaşımı

Yaklaşım oldukça iyi görünüyor!

Saddlepoint yaklaşımını entegre ederek ve yeniden ölçeklendirerek daha iyi bir yaklaşım elde edebiliriz:

> integrate(fhat, lower=0.1, upper=2)
1.026476 with absolute error < 9.7e-07

Şimdi, bu yaklaşıma dayanan kümülatif dağılım işlevi, sayısal entegrasyonla bulunabilir, ancak bunun için doğrudan bir sınır noktası yaklaşımı yapmak da mümkündür. Ama bu başka bir yazı için, bu yeterince uzun.

Son olarak, bazı gelişmeler yukarıdaki gelişme dışında kaldı. Gelen biz bir yaklaşım esas olarak üçüncü dönem göz ardı yaptı. Bunu neden yapabiliriz? Bir gözlem, normal yoğunluk işlevi için, sol-dışı teriminin hiçbir şeye katkıda bulunmadığı, böylece yaklaşıklığın kesin olduğu yönündedir. Bu yüzden, saddlepoint-yaklaşımı, merkezi limit teoreminde bir inceltme olduğundan, bu yüzden biraz normale yaklaştık, bu yüzden bu iyi sonuç vermeli. Bir de belirli örneklere bakabilirsiniz. Poisson dağılımına saddlepoint yaklaşımına bakıldığında, bu üçüncü terimden geriye bakıldığında, bu durumda, argüman sıfıra yakın olmadığında oldukça düz olan bir trigamma işlevi olur.(**)

Sonunda neden isim? Ad, karmaşık analiz tekniklerini kullanarak alternatif bir türevden geliyor. Daha sonra buna bakabiliriz, ama başka bir postada!


4
Şu ana kadar sahip olduğun şey harika. Oradaki gelişme çok açık.
Glen_b

1
kjetil Dört küçük yazım hatası düzeltmeye çalıştım 1. "Gelişimde yaklaşık 2'nin çalışması için gereken " 2. "yi izleyeceğim " 3. " Şimdi özlüyoruz " 4. " sadlepoint'in farklılaşmasını ima ediyor " ama bunu yaparken Denklemlerinizden birini kırdım gibi gözüküyor - nasıl bir fikrim yok, çünkü o metin öğelerinin dışında hiçbir şeyi değiştirmedim (düzenleme geçmişinden görebileceğiniz gibi). Geri alırdım ama bu hataları nasıl çözdüğümün bir soruna neden olduğunu açıklayamadığımdan, daha fazla soruna neden olmak istemiyorum. Özür dilerim. (Düzenleme oturumunu
açar açmaz

1
Düzenleme kodunda bu soruna yol açan bir matematik hatası veya bir hata olabilir.
Glen_b

1
@Christoph Hanek: Bazı specifix bir yakın sonucu elde etmek , sen saddlepoint denklemi çözmek bulmak için . xt(§)t
kjetil b halvorsen

2
Belki de, ampirik cgf kullanıldığında, ortaya çıkan saddlepoint yaklaşımının verinin dışbükey kabuğunun dışında tanımlanmadığını belirtmekte fayda vardır. Feuerverger (1989) “Ampirik Saddlepoint Yaklaşımı Üzerine” ye bakınız. Bu, yukarıdaki bootstrap örneğinde de olduğu gibi olmalıdır.
Matteo Fasiolo

15

Burada kjetil'in cevabını genişletiyorum ve Kümülan Üretme Fonksiyonunun (CGF) bilinmediği durumlara odaklanıyorum, ancak , burada . En basit CGF tahmincisi muhtemelen Davison ve Hinkley (1988) ki bu kjetillerin bootstrap örneğinde kullanıldı. Bu tahmin Elde saddlepoint denklemi dezavantajına sahiptir sadece çözülebilir , biz saddlepoint yoğunluğunu değerlendirmek istiyoruz nokta, ki dışbükey gövde içine düşmektedir .x1,,xnxRd

K^(λ)=1ni=1neλTxi,
K^(λ)=y,
yx1,,xn

Wong (1992) ve Fasiolo ve ark. (2016) bu sorunu, saddlepoint denkleminin herhangi bir için çözülebileceği şekilde tasarlanan iki alternatif CGF tahmincisi önererek ele almıştır . Fasiolo ve ark. (2016), genişletilmiş Ampirik Saddlepoint Yaklaşımı ESA olarak adlandırılan Esaddle R paketinde uygulanmıştır ve burada birkaç örnek vereceğim.y

Tek değişkenli basit bir örnek olarak, bir yoğunluğuna yaklaşmak için ESA'yı kullanın .Gamma(2,1)

library("devtools")
install_github("mfasiolo/esaddle")
library("esaddle")

########## Simulating data
x <- rgamma(1000, 2, 1)

# Fixing tuning parameter of ESA
decay <-  0.05

# Evaluating ESA at several point
xSeq <- seq(-2, 8, length.out = 200)
tmp <- dsaddle(y = xSeq, X = x, decay = decay, log = TRUE)

# Plotting true density, ESA and normal approximation
plot(xSeq, exp(tmp$llk), type = 'l', ylab = "Density", xlab = "x")
lines(xSeq, dgamma(xSeq, 2, 1), col = 3)
lines(xSeq, dnorm(xSeq, mean(x), sd(x)), col = 2)
suppressWarnings( rug(x) )
legend("topright", c("ESA", "Truth", "Gaussian"), col = c(1, 3, 2), lty = 1)

Bu uygun

görüntü tanımını buraya girin

Halıya bakıldığında, ESA yoğunluğunu veri aralığının dışında değerlendirdiğimiz açıktır. Daha zorlu bir örnek, aşağıdaki çarpık iki değişkenli Gaussian'dır.

# Function that evaluates the true density
dwarp <- function(x, alpha) {
  d <- length(alpha) + 1
  lik <- dnorm(x[ , 1], log = TRUE)
  tmp <- x[ , 1]^2
  for(ii in 2:d)
    lik <- lik + dnorm(x[ , ii] - alpha[ii-1]*tmp, log = TRUE)
  lik
}

# Function that simulates from true distribution
rwarp <- function(n = 1, alpha) {
  d <- length(alpha) + 1
  z <- matrix(rnorm(n*d), n, d)
  tmp <- z[ , 1]^2
  for(ii in 2:d) z[ , ii] <- z[ , ii] + alpha[ii-1]*tmp
  z
}

set.seed(64141)
# Creating 2d grid
m <- 50
expansion <- 1
x1 <- seq(-2, 3, length=m)* expansion; 
x2 <- seq(-3, 3, length=m) * expansion
x <- expand.grid(x1, x2) 

# Evaluating true density on grid
alpha <- 1
dw <- dwarp(x, alpha = alpha)

# Simulate random variables
X <- rwarp(1000, alpha = alpha)

# Evaluating ESA density
dwa <- dsaddle(as.matrix(x), X, decay = 0.1, log = FALSE)$llk

# Plotting true density
par(mfrow = c(1, 2))
plot(X, pch=".", col=1, ylim = c(min(x2), max(x2)), xlim = c(min(x1), max(x1)),
     main = "True density", xlab = expression(X[1]), ylab = expression(X[2]))
contour(x1, x2, matrix(dw, m, m), levels = quantile(as.vector(dw), seq(0.8, 0.995, length.out = 10)), col=2, add=T)

# Plotting ESA density
plot(X, pch=".",col=2, ylim = c(min(x2), max(x2)), xlim = c(min(x1), max(x1)),
     main = "ESA density", xlab = expression(X[1]), ylab = expression(X[2]))
contour(x1, x2, matrix(dwa, m, m), levels = quantile(as.vector(dwa), seq(0.8, 0.995, length.out = 10)), col=2, add=T)

görüntü tanımını buraya girin

Uyum oldukça iyi.


9

Kjetil'in mükemmel cevabı sayesinde, tartışmak istediğim küçük bir örnek bulmaya çalışıyorum çünkü konuyla ilgili bir noktaya değiniyor gibi görünüyor:

dağılımını göz önünde bulundurun . ve türevleri burada bulunabilir ve aşağıdaki koddaki fonksiyonlarda çoğaltılır. χ2(m)K(t)

x <- seq(0.01,20,by=.1)
m <- 5

K  <- function(t,m) -1/2*m*log(1-2*t)
K1 <- function(t,m) m/(1-2*t)
K2 <- function(t,m) 2*m/(1-2*t)^2

saddlepointapproximation <- function(x) {
  t <- .5-m/(2*x)
  exp( K(t,m)-t*x )*sqrt( 1/(2*pi*K2(t,m)) )
}
plot( x, saddlepointapproximation(x), type="l", col="salmon", lwd=2)
lines(x, dchisq(x,df=m), col="lightgreen", lwd=2)

Bu üretir

görüntü tanımını buraya girin

Bu açık bir şekilde, yoğunluğun nitel özelliklerini doğru yapan bir yaklaşım ortaya çıkarmaktadır, ancak Kjetil'in yorumunda da belirtildiği gibi, her yerdeki tam yoğunluğun üzerinde olduğu gibi uygun bir yoğunluk değildir. Yaklaştırmayı aşağıdaki gibi yeniden ölçeklendirmek, aşağıda çizilen neredeyse ihmal edilebilir yakınlaştırma hatasını verir.

scalingconstant <- integrate(saddlepointapproximation, x[1], x[length(x)])$value

approximationerror_unscaled <- dchisq(x,df=m) - saddlepointapproximation(x)
approximationerror_scaled   <- dchisq(x,df=m) - saddlepointapproximation(x) /
                                                    scalingconstant

plot( x, approximationerror_unscaled, type="l", col="salmon", lwd=2)
lines(x, approximationerror_scaled,             col="blue",   lwd=2)

görüntü tanımını buraya girin


1
Bu bir özelliktir, saddlepoint yaklaşımının bire bir bütünleşmesine gerek yoktur, ancak genellikle yakındır. Sayısal entegrasyon ile yeniden ölçeklendirilebilir.
kjetil b halvorsen

Göreceli hatayı çizmek daha açıklayıcı olabilir!
kjetil b halvorsen

approximationerror_unscaled/approximationerror_scaled25.90798 etrafında dolaştığı ortaya çıktı
Christoph Hanck
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.