कैसे काठी सन्निकटन काम करता है?


38

कैसे काठी सन्निकटन काम करता है ? यह किस तरह की समस्या है?
(उदाहरण के माध्यम से किसी विशेष उदाहरण या उदाहरण का उपयोग करने के लिए स्वतंत्र महसूस करें)

क्या कोई कमियां, कठिनाइयाँ, चीजों को देखने के लिए या अनचाहे के लिए जाल हैं?

जवाबों:


49

एक संभावना घनत्व समारोह के लिए काठी बिंदु सन्निकटन (यह बड़े पैमाने पर कार्यों के लिए इसी तरह काम करता है, लेकिन मैं केवल घनत्व के संदर्भ में यहां बात करूंगा) एक आश्चर्यजनक रूप से अच्छी तरह से काम कर रहा सन्निकटन है, जिसे केंद्रीय सिद्धांत प्रमेय पर शोधन के रूप में देखा जा सकता है। तो, यह केवल उन सेटिंग्स में काम करेगा जहां केंद्रीय सीमा प्रमेय है, लेकिन इसे मजबूत धारणा की आवश्यकता है।

हम इस धारणा के साथ शुरू करते हैं कि पल उत्पन्न करने वाला कार्य मौजूद है और दो बार भिन्न है। इसका तात्पर्य विशेष रूप से यह है कि सभी क्षण मौजूद हैं। चलो पल पैदा समारोह (MGF) के साथ एक यादृच्छिक चर हो और सीजीएफ (cumulant पैदा समारोह) (जहाँ प्राकृतिक लघुगणक को दर्शाता है)। विकास में मैं रोनाल्ड डब्ल्यू बटलर का अनुसरण करूंगा: "एप्लीकेशन के साथ सैडलप्वाइंट अप्रूवल" (सीयूपी)। हम एक निश्चित अभिन्न के लिए लाप्लास सन्निकटन का उपयोग करके काठी बिंदु सन्निकटन विकसित करेंगे। लिखो X

M(t)=EetX
K(t)=logM(t)log
eK(t)=etxf(x)dx=exp(tx+logf(x))dx=exp(h(t,x))dx
h ( t , x ) = - t x - log f ( x ) h ( t , x ) x t h ( t , x ) = h ( t , x 0 ) + h ( t , x 0 ) ( x - x 0 ) + 1 जहाँ । अब हम टेलर का विस्तार होगा में पर विचार एक निरंतर के रूप में। यह जहाँ ' x के संबंध में विभेदीकरण को दर्शाता है । ध्यान दें कि h '(t, x) = - t- \ frac {\ आंशिक} {\ आंशिक x} \ log f (x) \\ h' '(t, x) = - \ frac {\ आंशिक ^ 2} {आंशिक x ^ 2} \ log f (x)> 0 (अनुमान से अंतिम असमानता जैसा कि यह काम करने के लिए सन्निकटन के लिए आवश्यक है)। X_t देंh(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 का समाधान हो । हम मान लेंगे कि इस के लिए एक न्यूनतम देता है h(t,x) के एक समारोह के रूप में x । इंटीग्रल में इस विस्तार का उपयोग करना और भाग के बारे में भूल जाना ,
eK(t)exp(h(t,xt)12h(t,xt)(xxt)2)dx=eh(t,xt)e12h(t,xt)(xxt)2dx
जो एक गाऊसी अभिन्न अंग है, जिससे
eK(t)eh(t,xt)2πh(t,xt).
यह f (x_t) \ लगभग \ sqrt {\ frac {h '' (t, x_t)} {2 \ pi}} \ exp (K (t) -t x_t) के रूप में काठी के सन्निकटन के पहले संस्करण को देता है।
(*)f(xt)h(t,xt)2πexp(K(t)txt)
ध्यान दें कि सन्निकटन में एक घातीय परिवार का रूप है।

अब हमें इसे अधिक उपयोगी रूप में प्राप्त करने के लिए कुछ कार्य करने की आवश्यकता है।

से पर हम पाते हैं इसे संबंध में से (हमारी मान्यताओं द्वारा) प्राप्त होता है, इसलिए और बीच का संबंध मोनोटोन है, इसलिए अच्छी तरह से परिभाषित है। हमें को एक सन्निकटन की आवश्यकता है । उस अंत तक, हम से हल करके प्राप्त करते हैंh(t,xt)=0

t=xtlogf(xt).
xt
txt=2xt2logf(xt)>0
txtxtxtlogf(xt)(*)
(**)logf(xt)=K(t)txt12log2π2xt2logf(xt).
मान लिया जाये कि केवल ऊपर पिछले अवधि पर निर्भर करता है कमजोर , तो के संबंध में इसकी व्युत्पन्न लगभग शून्य है (हम इस पर टिप्पणी करने के लिए वापस आ जाएगा) पर हम पाते हैं इस सन्निकटन तक हमारे पास फिर से ताकि और समीकरण माध्यम से संबंधित होना चाहिए जिसे काठी समीकरण कहा जाता है। xtxt
logf(xt)xt(K(t)xt)txtt
0t+logf(xt)xt=(K(t)xt)txt
txt
(§)K(t)xt=0,

अब हम को निर्धारित करने में चूक गए हैं और यह कि हम काठी के समीकरण : के विभक्त विभेदन द्वारा पा सकते हैं नतीजा यह है कि (अप हमारे सन्निकटन करने के लिए) है सब कुछ एक साथ रखें, हम घनत्व के अंतिम saddlepoint सन्निकटन है के रूप में (*)

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).
अब, इस व्यावहारिक रूप से उपयोग करने के लिए, एक विशिष्ट बिंदु पर घनत्व को अनुमानित करने के लिए , हम को खोजने के लिए उस लिए काठी के समीकरण को हल करते हैं ।xtxtt

काठी बिंदु सन्निकटन अक्सर iid अवलोकनों पर आधारित माध्य के घनत्व के सन्निकटन के रूप में कहा जाता है । माध्य का सहवर्ती उत्पादक कार्य बस , इसलिए माध्य के लिए काठी बिंदु सन्निकटन nX1,X2,,XnnK(t)

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

पहले उदाहरण पर नजर डालते हैं। अगर हम मानक सामान्य घनत्व mgf तो इसलिए काठी का समीकरण और काठी सन्निकटन देता तो इस मामले में सन्निकटन सटीक है।

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

चलिए एक बहुत ही अलग एप्लिकेशन को देखते हैं: ट्रांसफॉर्मेशन डोमेन में बूटस्ट्रैप, हम माध्य के बूटस्ट्रैप वितरण के लिए सैडलप्वाइंट सन्निकटन का उपयोग करके विश्लेषणात्मक रूप से बूटस्ट्रैपिंग कर सकते हैं!

मान लें कि हमारे पास iid कुछ घनत्व से वितरित है (सिम्युलेटेड उदाहरण में हम एक इकाई घातांक वितरण का उपयोग करेंगे)। नमूना से हम कार्यशील पल की गणना करते हैं, जो कार्य उत्पन्न करते हैं और फिर आनुभविक cgf । हमें उस मतलब के लिए आनुभविक mgf चाहिए जो और मतलब # के लिए आनुभविक cgf है। जिसका उपयोग हम एक सैडलप्वाइंट सन्निकटन के निर्माण के लिए करते हैं। निम्नलिखित कुछ आर कोड में (आर संस्करण 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

(मैंने इसे सामान्य कोड के रूप में लिखने की कोशिश की है जिसे अन्य cgfs के लिए आसानी से संशोधित किया जा सकता है, लेकिन कोड अभी भी बहुत मजबूत नहीं है ...)

फिर हम एक इकाई घातांक वितरण से दस स्वतंत्र टिप्पणियों के नमूने के लिए इसका उपयोग करते हैं। हम "हाथ से" सामान्य सामान्य बूटस्ट्रैपिंग करते हैं, इस परिणाम के लिए बूटस्ट्रैप हिस्टोग्राम की साजिश रचते हैं, और काठी के सन्निकटन को पलट देते हैं:

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

परिणामी भूखंड देना:

बूटस्ट्रैप वितरण की काठी का अनुमान

सन्निकटन अच्छा लग रहा है!

हम एक और भी बेहतर सन्निकटन का अनुमान लगाकर समेकन और rescaling प्राप्त कर सकते हैं:

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

अब इस सन्निकटन पर आधारित संचयी वितरण समारोह संख्यात्मक एकीकरण द्वारा पाया जा सकता है, लेकिन इसके लिए एक सीधा काठी अनुमान लगाना भी संभव है। लेकिन यह एक और पोस्ट के लिए है, यह काफी लंबा है।

अंत में, कुछ टिप्पणियां ऊपर के विकास से बाहर निकल गईं। में हम एक सन्निकटन अनिवार्य रूप से तीसरे कार्यकाल की अनदेखी की थी। हम ऐसा क्यों कर सकते हैं? एक अवलोकन यह है कि सामान्य घनत्व फ़ंक्शन के लिए, बाएं-आउट शब्द कुछ भी योगदान नहीं देता है, ताकि अनुमान सटीक हो। इसलिए, चूंकि काठी बिंदु-सन्निकटन केंद्रीय सीमा प्रमेय पर परिशोधन है, इसलिए हम सामान्य से कुछ करीब हैं, इसलिए इसे अच्छी तरह से काम करना चाहिए। कोई विशिष्ट उदाहरण भी देख सकता है। पॉइसन वितरण के लिए काठी के सन्निकटन को देखते हुए, उस बाएं-तीसरे तीसरे शब्द को देखते हुए, इस मामले में जो एक ट्रिग्मा फ़ंक्शन बन जाता है, जो वास्तव में सपाट होता है जब तर्क शून्य के करीब नहीं होता है।(**)

अंत में, नाम क्यों? जटिल-विश्लेषण तकनीकों का उपयोग करके नाम एक वैकल्पिक व्युत्पत्ति से आता है। बाद में हम उस पर गौर कर सकते हैं, लेकिन किसी अन्य पोस्ट में!


4
अब तक आपके पास जो कुछ है वह बहुत अच्छा है। वहां का विकास बहुत स्पष्ट है।
ग्लेन_ बी

1
kjetil I ने चार छोटे टाइपो को ठीक करने का प्रयास किया। 1. " विकास में मैं wil follow " 2. " काम करने के लिए सन्निकटन की आवश्यकता है " 3. " अब हम क्या याद करते हैं " 4. " सैडलप्वाइंट का निहितार्थ " लेकिन ऐसा करने में ऐसा लगता है कि मैंने आपके किसी समीकरण को तोड़ दिया है - मुझे नहीं पता कि कैसे, क्योंकि मैंने कुछ भी नहीं बदला लेकिन उन टेक्स्ट आइटम्स (जैसा कि आप एडिट हिस्ट्री से देख सकते हैं)। मैं इसे वापस ले लूंगा, लेकिन जब से मैं यह नहीं बता पा रहा हूं कि उन त्रुटियों को कैसे ठीक किया जाए तो मैं एक समस्या पैदा कर सकता हूं जो अभी भी आगे की समस्याओं का कारण नहीं है। मैं क्षमाप्रार्थी हूं। (यह वास्तव में ऐसा लग रहा था जैसे ही मैंने संपादन सत्र खोला जैसे ही टूट गया)
Glen_b

1
यह संभव है कि एडिट कोड में एक मैथजैक्स बग या बग हो जो इस समस्या की ओर ले जाए।
ग्लेन_ब

1
@Christoph Hanck: कुछ Specix पर सन्निकटन प्राप्त करने के लिए , आप खोजने के लिए सैडलपॉइंट समीकरण को हल करते हैं । xt(§)t
kjetil b halvorsen

2
शायद यह इंगित करने के लायक है कि, जब अनुभवजन्य सीजीएफ का उपयोग किया जाता है, तो परिणामी काठी बिंदु सन्निकटन डेटा के उत्तल पतवार के बाहर अपरिभाषित होता है। फेउवरवर्जर (1989) "एम्पिरिकल सैडलप्वाइंट अप्रूवल पर" देखें। यह मामला ऊपर के बूटस्ट्रैप उदाहरण में भी होना चाहिए।
मैटेयो फासिओलो

15

यहां मैं kjetil के उत्तर पर विस्तार करता हूं, और मैं उन स्थितियों पर ध्यान केंद्रित करता हूं जहां Cumulant जनरेटिंग फंक्शन (CGF) अज्ञात है, लेकिन यह डेटा से अनुमान लगाया जा सकता है , जहां । सबसे सरल CGF आकलनकर्ता शायद डेविसन और हिंकले (1988) जो kjetil के बूटस्ट्रैप उदाहरण में इस्तेमाल किया गया है। इस अनुमानक का दोष यह है कि परिणामी काठी बिंदु समीकरण केवल तभी हल किया जा सकता है यदि , जिस बिंदु पर हम काठी के घनत्व का मूल्यांकन करना चाहते हैं, वह के उत्तल खण्ड के भीतर आता है ।x1,,xnxRd

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

वोंग (1992) और फैसिओलो एट अल। (२०१६) ने दो वैकल्पिक सीजीएफ अनुमानकों को प्रस्तावित करके इस समस्या को संबोधित किया, इस तरह से डिजाइन किया गया कि किसी भी लिए काठी का समीकरण हल किया जा सकता है । Fasiolo et al का समाधान। (2016), जिसे एक्सपीरियंस्ड सैडलपॉइंट अप्रैसेशन ईएसए कहा जाता है, को एसैडल आर पैकेज में लागू किया जाता है और यहां मैं कुछ उदाहरण देता हूं।y

एक साधारण अविभाज्य उदाहरण के रूप में, एक घनत्व का अनुमान लगाने के लिए ईएसए का उपयोग करने पर विचार करें ।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)

यह फिट है

यहाँ छवि विवरण दर्ज करें

गलीचा को देखते हुए यह स्पष्ट है कि हमने डेटा की सीमा के बाहर ईएसए घनत्व का मूल्यांकन किया। एक अधिक चुनौतीपूर्ण उदाहरण निम्नलिखित विकृत द्विभाजित गाऊसी है।

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

यहाँ छवि विवरण दर्ज करें

फिट बहुत अच्छा है।


9

Kjetil के महान जवाब के लिए धन्यवाद मैं खुद एक छोटे से उदाहरण के साथ आने की कोशिश कर रहा हूं, जिस पर मैं चर्चा करना चाहूंगा क्योंकि यह एक प्रासंगिक बिंदु उठाता है:

वितरण पर विचार करें । और इसका व्युत्पन्न यहां पाया जा सकता है और नीचे दिए गए कोड में फ़ंक्शन में पुन: पेश किया जाता है। χ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)

यह पैदा करता है

यहाँ छवि विवरण दर्ज करें

यह स्पष्ट रूप से एक सन्निकटन पैदा करता है जिसे घनत्व की गुणात्मक विशेषताएं मिलती हैं, लेकिन, जैसा कि केजेटिल की टिप्पणी में पुष्टि की गई है, एक उचित घनत्व नहीं है, क्योंकि यह हर जगह सटीक घनत्व से ऊपर है। निम्नानुसार सन्निकटन को फिर से व्यवस्थित करना नीचे दिए गए लगभग नगण्य सन्निकटन त्रुटि देता है।

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)

यहाँ छवि विवरण दर्ज करें


1
यह एक विशेषता है, काठी की सन्निकटन को एक के लिए एकीकृत करने की आवश्यकता नहीं है, लेकिन अक्सर करीब है। यह संख्यात्मक एकीकरण द्वारा पुनर्निर्मित किया जा सकता है।
kjetil b halvorsen

यह सापेक्ष त्रुटि की साजिश करने के लिए और अधिक खुलासा हो सकता है!
kjetil b halvorsen

approximationerror_unscaled/approximationerror_scaled25.90798 के आसपास घूमता है
क्रिस्टोफ़ हनक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.