Yanıtlar:
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
Ş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,
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
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ı
İ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.
Ç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):
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:
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!
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 .
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.
Tek değişkenli basit bir örnek olarak, bir yoğunluğuna yaklaşmak için ESA'yı kullanın .
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
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)
Uyum oldukça iyi.
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.
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
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)
approximationerror_unscaled/approximationerror_scaled
25.90798 etrafında dolaştığı ortaya çıktı