Jak działa przybliżanie saddlepoint? Dla jakiego rodzaju problemu jest to dobre?
(Możesz użyć konkretnego przykładu lub przykładów jako ilustracji)
Czy są jakieś wady, trudności, rzeczy, na które należy uważać, lub pułapki na nieostrożnych?
Jak działa przybliżanie saddlepoint? Dla jakiego rodzaju problemu jest to dobre?
(Możesz użyć konkretnego przykładu lub przykładów jako ilustracji)
Czy są jakieś wady, trudności, rzeczy, na które należy uważać, lub pułapki na nieostrożnych?
Przybliżenie punktu sadd do funkcji gęstości prawdopodobieństwa (działa podobnie w przypadku funkcji masy, ale będę mówić tutaj tylko w odniesieniu do gęstości) jest zaskakująco dobrze działającym przybliżeniem, które można postrzegać jako udoskonalenie centralnego twierdzenia o granicy. Będzie więc działał tylko w ustawieniach, w których istnieje centralne twierdzenie o limicie, ale wymaga silniejszych założeń.
Zaczynamy od założenia, że funkcja generowania momentu istnieje i jest dwukrotnie rozróżnialna. Oznacza to w szczególności, że wszystkie chwile istnieją. Niech będzie zmienną losową z funkcją generowania momentu (mgf)
Teraz musimy trochę popracować, aby uzyskać to w bardziej użytecznej formie.
Z otrzymujemy
Spójrzmy na zupełnie inną aplikację: Bootstrap w domenie transformacji, możemy wykonać bootstrap analitycznie, używając przybliżenia saddlepoint do rozkładu bootstrap średniej!
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
(Próbowałem napisać ten kod jako ogólny kod, który można łatwo modyfikować dla innych programów cgfs, ale kod nadal nie jest zbyt solidny ...)
Następnie używamy tego do próby dziesięciu niezależnych obserwacji z jednostkowego rozkładu wykładniczego. Wykonujemy zwykłe nieparametryczne ładowanie początkowe „ręcznie”, wykreślamy wynikowy histogram ładowania dla średniej i zastępujemy przybliżenie punktu Saddlepoint:
> 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)
Dając wynikowy wykres:
Przybliżenie wydaje się raczej dobre!
Możemy uzyskać jeszcze lepsze przybliżenie, integrując przybliżenie punktu saddpap i przeskalowanie:
> integrate(fhat, lower=0.1, upper=2)
1.026476 with absolute error < 9.7e-07
Teraz funkcję rozkładu skumulowanego opartą na tym przybliżeniu można znaleźć za pomocą całkowania numerycznego, ale możliwe jest również bezpośrednie przybliżenie tego punktu. Ale to jest na inny post, to wystarczy.
Wreszcie, dlaczego nazwa? Nazwa pochodzi od alternatywnej pochodnej, wykorzystującej techniki analizy złożonej. Później możemy przyjrzeć się temu, ale w innym poście!
To pasuje
Patrząc na dywan, widać, że oceniliśmy gęstość ESA poza zakresem danych. Bardziej wymagającym przykładem jest następujący wypaczony dwuwymiarowy gaussowski.
Dopasowanie jest całkiem dobre.
źródło
Dzięki świetnej odpowiedzi Kjetil sam próbuję wymyślić mały przykład, który chciałbym omówić, ponieważ wydaje się, że porusza on istotną kwestię:
To produkuje
To oczywiście daje przybliżenie, które poprawia cechy jakościowe gęstości, ale, jak potwierdzono w komentarzu Kjetila, nie jest właściwą gęstością, ponieważ jest wszędzie powyżej dokładnej gęstości. Ponowne skalowanie aproksymacji w następujący sposób daje niemal pomijalny błąd aproksymacji przedstawiony poniżej.
źródło
approximationerror_unscaled/approximationerror_scaled
Okazuje się, że unosi się około 25.90798