Làm thế nào để xấp xỉ yên ngựa làm việc?


38

Làm thế nào để xấp xỉ yên ngựa làm việc? Những loại vấn đề là nó tốt cho?
(Vui lòng sử dụng một ví dụ cụ thể hoặc ví dụ bằng cách minh họa)

Có bất kỳ nhược điểm, khó khăn, những điều cần chú ý, hoặc bẫy cho người không sẵn sàng?

Câu trả lời:


49

Xấp xỉ xấp xỉ với hàm mật độ xác suất (nó hoạt động tương tự đối với các hàm khối lượng, nhưng tôi sẽ chỉ nói ở đây về mật độ) là một xấp xỉ hoạt động tốt đáng ngạc nhiên, có thể được xem như là một sàng lọc trên định lý giới hạn trung tâm. Vì vậy, nó sẽ chỉ hoạt động trong các cài đặt có định lý giới hạn trung tâm, nhưng nó cần các giả định mạnh hơn.

Chúng tôi bắt đầu với giả định rằng hàm tạo mô men tồn tại và có thể phân biệt hai lần. Điều này ngụ ý đặc biệt rằng tất cả các khoảnh khắc tồn tại. Đặt là biến ngẫu nhiên có hàm tạo mô men (mgf) và cgf (hàm tạo tích lũy) K (t) = \ log M (t) (trong đó \ log biểu thị logarit tự nhiên). Trong quá trình phát triển, tôi sẽ theo sát Ronald W Butler: "Khoảng cách gần đúng với các ứng dụng" (CUP). Chúng tôi sẽ phát triển xấp xỉ yên ngựa bằng cách sử dụng xấp xỉ Laplace đến một tích phân nhất định. Viết X

M(t)=EetX
K(t)=logM(t)log
eK(t)=etxf(x)dx=exp(tx+logf(x))dx=exp(h(t,x))dx
trong đó h(t,x)=txlogf(x) . Bây giờ chúng ta sẽ Taylor mở rộngh(t,x) trongx coit là hằng số. Điều này cho
h(t,x)=h(t,x0)+h(t,x0)(xx0)+12h(t,x0)(xx0)2+
trong đó biểu thị sự khác biệt đối vớix . Lưu ý rằng
h(t,x)=txlogf(x)h(t,x)=2x2logf(x)>0
(bất đẳng thức cuối cùng theo giả định vì nó cần thiết cho phép tính gần đúng hoạt động). Hãy đểxtlà giải pháp cho h(t,xt)=0 . Chúng tôi sẽ giả sử rằng điều này cung cấp tối thiểu cho h(t,x) là hàm của x . Sử dụng phần mở rộng này trong tích phân và quên đi phần , mang lại cho
eK(t)exp(h(t,xt)12h(t,xt)(xxt)2)dx=eh(t,xt)e12h(t,xt)(xxt)2dx
là tích phân Gaussian, cho
eK(t)eh(t,xt)2πh(t,xt).
Điều này mang lại (một phiên bản đầu tiên) của xấp xỉ yên ngựa là
(*)f(xt)h(t,xt)2πexp(K(t)txt)
Lưu ý rằng phép tính gần đúng có dạng một gia đình hàm mũ.

Bây giờ chúng ta cần thực hiện một số công việc để có được điều này ở dạng hữu ích hơn.

Từ ta được Việc phân biệt điều này với cho (theo giả định của chúng tôi), vì vậy mối quan hệ giữa và là đơn điệu, vì vậy được xác định rõ. Chúng ta cần một xấp xỉ với . Cuối cùng, chúng tôi nhận được bằng cách giải quyết từh(t,xt)=0

t=xtlogf(xt).
xt
txt=2xt2logf(xt)>0
txtxtxtlogf(xt) log f ( x t ) = K ( t ) - t x t - 1(*)
(**)logf(xt)=K(t)txt12log2π2xt2logf(xt).
xtxtlogf(xt) Giả sử thuật ngữ cuối cùng ở trên chỉ phụ thuộc yếu vào , do đó đạo hàm của nó đối với xấp xỉ bằng 0 (chúng tôi sẽ quay lại nhận xét về điều này), chúng tôi nhận được Tính đến gần đúng này, sau đó chúng ta có để và phải liên quan thông qua phương trình được gọi là phương trình yên ngựa. xtxt
logf(xt)xt(K(t)xt)txtt
0t+logf(xt)xt=(K(t)xt)txt
txt
(§)K(t)xt=0,

Điều chúng ta bỏ lỡ bây giờ khi xác định là và chúng ta có thể tìm thấy bằng cách phân biệt ngầm định phương trình yên ngựa : Kết quả là (tối đa xấp xỉ của chúng tôi) Đặt mọi thứ lại với nhau, chúng ta có xấp xỉ điểm yên cuối cùng của mật độ là h ( t , x t ) = - 2 log f ( x t )(*)

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).
Bây giờ, để sử dụng điều này một cách thực tế, để xấp xỉ mật độ tại một điểm cụ thể , chúng tôi giải phương trình yên ngựa cho đó để tìm .xtxtt

Giá trị gần đúng của điểm yên thường được xác định là xấp xỉ với mật độ trung bình dựa trên các quan sát iid . Hàm tạo tích lũy của giá trị trung bình chỉ đơn giản là , do đó, xấp xỉ điểm yên cho giá trị trung bình trở thành nX1,X2,,XnnK(t)

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

Chúng ta hãy xem xét một ví dụ đầu tiên. Chúng ta sẽ nhận được gì nếu chúng ta cố gắng xấp xỉ mật độ chuẩn thông thường mgf là vì vậy nên phương trình yên ngựa là và phép tính xấp xỉ yên cho vì vậy trong trường hợp này, phép tính gần đúng là chính xác.

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

Chúng ta hãy xem xét một ứng dụng rất khác: Bootstrap trong miền biến đổi, chúng ta có thể thực hiện bootstrapping một cách phân tích bằng cách sử dụng xấp xỉ yên cho phân phối bootstrap của giá trị trung bình!

Giả sử chúng ta có iid được phân phối từ một số mật độ (trong ví dụ mô phỏng, chúng ta sẽ sử dụng phân phối theo cấp số nhân đơn vị). Từ mẫu, chúng tôi tính toán hàm tạo mô men theo kinh nghiệm và sau đó là cgf . Chúng ta cần mgf theo kinh nghiệm với nghĩa là và cgf theo kinh nghiệm cho trung bình mà chúng tôi sử dụng để xây dựng một xấp xỉ điểm yên ngựa. Trong một số mã R sau (phiên bản R 3.2.3): X1,X2,,Xnf

M^(t)=1ni=1netxi
K (t)=log M (t)log( M (t/nK^(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

(Tôi đã cố viết mã này thành mã chung có thể dễ dàng sửa đổi cho các cgfs khác, nhưng mã vẫn không mạnh lắm ...)

Sau đó, chúng tôi sử dụng mẫu này cho một mẫu gồm mười quan sát độc lập từ phân bố hàm mũ đơn vị. Chúng tôi thực hiện "bẻ khóa" bằng tay thông thường, vẽ biểu đồ bootstrap kết quả cho giá trị trung bình và ghi đè lên xấp xỉ điểm yên ngựa:

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

Đưa ra cốt truyện kết quả:

xấp xỉ yên ngựa của phân phối bootstrap

Sự gần đúng có vẻ là khá tốt!

Chúng ta có thể có được một xấp xỉ thậm chí tốt hơn bằng cách tích hợp xấp xỉ yên và thay đổi tỷ lệ:

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

Bây giờ hàm phân phối tích lũy dựa trên phép tính gần đúng này có thể được tìm thấy bằng tích hợp số, nhưng cũng có thể thực hiện xấp xỉ điểm yên trực tiếp cho điều đó. Nhưng đó là cho một bài viết khác, điều này là đủ dài.

Cuối cùng, một số ý kiến ​​rời khỏi sự phát triển ở trên. Trong chúng tôi đã thực hiện một phép tính gần đúng về cơ bản bỏ qua thuật ngữ thứ ba. Tại sao chúng ta có thể làm điều đó? Một quan sát là đối với hàm mật độ bình thường, thuật ngữ bên trái không đóng góp gì, do đó, phép tính gần đúng là chính xác. Vì vậy, vì xấp xỉ yên ngựa là một sàng lọc trên định lý giới hạn trung tâm, vì vậy chúng tôi hơi gần với bình thường, vì vậy điều này sẽ hoạt động tốt. Người ta cũng có thể nhìn vào các ví dụ cụ thể. Nhìn vào xấp xỉ điểm yên ngựa với phân phối Poisson, nhìn vào thuật ngữ thứ ba còn sót lại, trong trường hợp này trở thành hàm trigamma, thực sự khá phẳng khi đối số không gần bằng không.(**)

Cuối cùng, tại sao tên? Tên đến từ một dẫn xuất thay thế, sử dụng các kỹ thuật phân tích phức tạp. Sau này chúng ta có thể xem xét điều đó, nhưng trong một bài viết khác!


4
Những gì bạn có cho đến nay là tuyệt vời. Sự phát triển ở đó rất rõ ràng.
Glen_b -Reinstate Monica

1
kjetil Tôi đã cố gắng sửa bốn lỗi chính tả nhỏ 1. " Trong quá trình phát triển tôi sẽ làm theo " 2. " cần thiết cho phép tính gần đúng để làm việc " 3. " Những gì chúng ta bỏ lỡ bây giờ " 4. " phân biệt ngầm của sadlepoint " nhưng khi làm như vậy có vẻ như tôi đã phá vỡ một trong các phương trình của bạn - tôi không biết làm thế nào, vì tôi không thay đổi ngoài những mục văn bản đó (như bạn có thể thấy trong lịch sử chỉnh sửa). Tôi sẽ khôi phục lại nhưng vì tôi không thể giải thích cách khắc phục các lỗi đó gây ra sự cố nên tôi không muốn gây ra sự cố tiếp theo. Lời xin lỗi của tôi.

1
Có thể có lỗi mathJax hoặc lỗi trong mã chỉnh sửa dẫn đến sự cố này.
Glen_b -Reinstate Monica

1
@Christoph Hanck: Để có được một xấp xỉ tại một số specifix , bạn giải phương trình để tìm . xt(§)t
kjetil b halvorsen

2
Có lẽ nó đáng để chỉ ra rằng, khi cgf theo kinh nghiệm được sử dụng, kết quả gần đúng của yên được xác định bên ngoài vỏ lồi của dữ liệu. Xem Feuerverger (1989) "Về phương pháp xấp xỉ yên ngựa theo kinh nghiệm". Đây cũng là trường hợp trong ví dụ bootstrap ở trên.
Matteo Fasiolo

15

Ở đây tôi mở rộng dựa trên câu trả lời của kjetil và tôi tập trung vào những tình huống mà Hàm tạo tích lũy (CGF) không xác định, nhưng có thể ước tính từ dữ liệu , trong đó . Công cụ ước tính CGF đơn giản nhất có lẽ là của Davison và Hinkley (1988) là cái được sử dụng trong ví dụ bootstrap của kjetil. Công cụ ước tính này có nhược điểm là phương trình yên ngựa kết quả có thể được giải nếu , điểm mà chúng tôi muốn đánh giá mật độ điểm yên, nằm trong thân lồi của . x R d K ( λ ) = 1x1,,xnxRd K '(λ)=y,yx1,...,xn

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

Wong (1992)Fasiolo et al. (2016) đã giải quyết vấn đề này bằng cách đề xuất hai công cụ ước tính CGF thay thế, được thiết kế theo cách mà phương trình yên có thể được giải cho bất kỳ . Giải pháp của Fasiolo et al. (2016), được gọi là ESA xấp xỉ theo kinh nghiệm dựa trên kinh nghiệm mở rộng, được triển khai trong gói R yên ngựa và ở đây tôi đưa ra một vài ví dụ.y

Là một ví dụ đơn biến đơn giản, hãy xem xét sử dụng ESA để xấp xỉ mật độ .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)

Đây là sự phù hợp

nhập mô tả hình ảnh ở đây

Nhìn vào tấm thảm, rõ ràng chúng tôi đã đánh giá mật độ ESA ngoài phạm vi dữ liệu. Một ví dụ khó khăn hơn là Gaussian bivariate bị biến dạng sau đây.

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

nhập mô tả hình ảnh ở đây

Phù hợp là khá tốt.


9

Nhờ câu trả lời tuyệt vời của Kjetil, tôi đang cố gắng tự mình đưa ra một ví dụ nhỏ, điều mà tôi muốn thảo luận bởi vì nó dường như nêu lên một điểm liên quan:

Hãy xem xét phân phối . và các dẫn xuất của nó có thể được tìm thấy ở đây và được sao chép trong các hàm trong mã dưới đây. K ( t )χ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)

Điều này tạo ra

nhập mô tả hình ảnh ở đây

Điều này rõ ràng tạo ra một xấp xỉ có được các đặc tính định tính của mật độ, nhưng, như đã xác nhận trong nhận xét của Kjetil, không phải là mật độ thích hợp, vì nó nằm trên mật độ chính xác ở mọi nơi. Thay đổi kích thước gần đúng như sau sẽ đưa ra lỗi xấp xỉ không đáng kể được vẽ dưới đây.

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)

nhập mô tả hình ảnh ở đây


1
Đây là một tính năng, xấp xỉ yên không cần tích hợp với một, nhưng thường gần. Nó có thể được định cỡ lại bằng tích hợp số.
kjetil b halvorsen

Nó có thể được tiết lộ nhiều hơn để vẽ lỗi tương đối!
kjetil b halvorsen

approximationerror_unscaled/approximationerror_scaledquay ra bay lượn vào khoảng 25.90798
Christoph Hanck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.