जवाबों:
एक संभावना घनत्व समारोह के लिए काठी बिंदु सन्निकटन (यह बड़े पैमाने पर कार्यों के लिए इसी तरह काम करता है, लेकिन मैं केवल घनत्व के संदर्भ में यहां बात करूंगा) एक आश्चर्यजनक रूप से अच्छी तरह से काम कर रहा सन्निकटन है, जिसे केंद्रीय सिद्धांत प्रमेय पर शोधन के रूप में देखा जा सकता है। तो, यह केवल उन सेटिंग्स में काम करेगा जहां केंद्रीय सीमा प्रमेय है, लेकिन इसे मजबूत धारणा की आवश्यकता है।
हम इस धारणा के साथ शुरू करते हैं कि पल उत्पन्न करने वाला कार्य मौजूद है और दो बार भिन्न है। इसका तात्पर्य विशेष रूप से यह है कि सभी क्षण मौजूद हैं। चलो पल पैदा समारोह (MGF) के साथ एक यादृच्छिक चर हो
और सीजीएफ (cumulant पैदा समारोह) (जहाँ प्राकृतिक लघुगणक को दर्शाता है)। विकास में मैं रोनाल्ड डब्ल्यू बटलर का अनुसरण करूंगा: "एप्लीकेशन के साथ सैडलप्वाइंट अप्रूवल" (सीयूपी)। हम एक निश्चित अभिन्न के लिए लाप्लास सन्निकटन का उपयोग करके काठी बिंदु सन्निकटन विकसित करेंगे। लिखो
अब हमें इसे अधिक उपयोगी रूप में प्राप्त करने के लिए कुछ कार्य करने की आवश्यकता है।
से पर हम पाते हैं
इसे संबंध में से
(हमारी मान्यताओं द्वारा) प्राप्त होता है, इसलिए और बीच का संबंध मोनोटोन है, इसलिए अच्छी तरह से परिभाषित है। हमें को एक सन्निकटन की आवश्यकता है । उस अंत तक, हम से हल करके प्राप्त करते हैं
अब हम को
निर्धारित करने में चूक गए हैं
और यह कि हम काठी के समीकरण :
के विभक्त विभेदन द्वारा पा सकते हैं
नतीजा यह है कि (अप हमारे सन्निकटन करने के लिए) है
सब कुछ एक साथ रखें, हम घनत्व के अंतिम saddlepoint सन्निकटन है के रूप में
काठी बिंदु सन्निकटन अक्सर iid अवलोकनों पर आधारित माध्य के घनत्व के सन्निकटन के रूप में कहा जाता है । माध्य का सहवर्ती उत्पादक कार्य बस , इसलिए माध्य के लिए काठी बिंदु सन्निकटन
पहले उदाहरण पर नजर डालते हैं। अगर हम मानक सामान्य घनत्व
mgf तो
इसलिए काठी का समीकरण और काठी सन्निकटन देता
तो इस मामले में सन्निकटन सटीक है।
चलिए एक बहुत ही अलग एप्लिकेशन को देखते हैं: ट्रांसफॉर्मेशन डोमेन में बूटस्ट्रैप, हम माध्य के बूटस्ट्रैप वितरण के लिए सैडलप्वाइंट सन्निकटन का उपयोग करके विश्लेषणात्मक रूप से बूटस्ट्रैपिंग कर सकते हैं!
मान लें कि हमारे पास iid कुछ घनत्व से वितरित है (सिम्युलेटेड उदाहरण में हम एक इकाई घातांक वितरण का उपयोग करेंगे)। नमूना से हम कार्यशील पल की गणना करते हैं, जो कार्य
उत्पन्न करते हैं और फिर आनुभविक cgf । हमें उस मतलब के लिए आनुभविक mgf चाहिए जो और मतलब # के लिए आनुभविक cgf है।
जिसका उपयोग हम एक सैडलप्वाइंट सन्निकटन के निर्माण के लिए करते हैं। निम्नलिखित कुछ आर कोड में (आर संस्करण 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
(मैंने इसे सामान्य कोड के रूप में लिखने की कोशिश की है जिसे अन्य 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
अब इस सन्निकटन पर आधारित संचयी वितरण समारोह संख्यात्मक एकीकरण द्वारा पाया जा सकता है, लेकिन इसके लिए एक सीधा काठी अनुमान लगाना भी संभव है। लेकिन यह एक और पोस्ट के लिए है, यह काफी लंबा है।
अंत में, कुछ टिप्पणियां ऊपर के विकास से बाहर निकल गईं। में हम एक सन्निकटन अनिवार्य रूप से तीसरे कार्यकाल की अनदेखी की थी। हम ऐसा क्यों कर सकते हैं? एक अवलोकन यह है कि सामान्य घनत्व फ़ंक्शन के लिए, बाएं-आउट शब्द कुछ भी योगदान नहीं देता है, ताकि अनुमान सटीक हो। इसलिए, चूंकि काठी बिंदु-सन्निकटन केंद्रीय सीमा प्रमेय पर परिशोधन है, इसलिए हम सामान्य से कुछ करीब हैं, इसलिए इसे अच्छी तरह से काम करना चाहिए। कोई विशिष्ट उदाहरण भी देख सकता है। पॉइसन वितरण के लिए काठी के सन्निकटन को देखते हुए, उस बाएं-तीसरे तीसरे शब्द को देखते हुए, इस मामले में जो एक ट्रिग्मा फ़ंक्शन बन जाता है, जो वास्तव में सपाट होता है जब तर्क शून्य के करीब नहीं होता है।
अंत में, नाम क्यों? जटिल-विश्लेषण तकनीकों का उपयोग करके नाम एक वैकल्पिक व्युत्पत्ति से आता है। बाद में हम उस पर गौर कर सकते हैं, लेकिन किसी अन्य पोस्ट में!
यहां मैं kjetil के उत्तर पर विस्तार करता हूं, और मैं उन स्थितियों पर ध्यान केंद्रित करता हूं जहां Cumulant जनरेटिंग फंक्शन (CGF) अज्ञात है, लेकिन यह डेटा से अनुमान लगाया जा सकता है , जहां । सबसे सरल CGF आकलनकर्ता शायद डेविसन और हिंकले (1988) जो kjetil के बूटस्ट्रैप उदाहरण में इस्तेमाल किया गया है। इस अनुमानक का दोष यह है कि परिणामी काठी बिंदु समीकरण केवल तभी हल किया जा सकता है यदि , जिस बिंदु पर हम काठी के घनत्व का मूल्यांकन करना चाहते हैं, वह के उत्तल खण्ड के भीतर आता है ।
वोंग (1992) और फैसिओलो एट अल। (२०१६) ने दो वैकल्पिक सीजीएफ अनुमानकों को प्रस्तावित करके इस समस्या को संबोधित किया, इस तरह से डिजाइन किया गया कि किसी भी लिए काठी का समीकरण हल किया जा सकता है । Fasiolo et al का समाधान। (2016), जिसे एक्सपीरियंस्ड सैडलपॉइंट अप्रैसेशन ईएसए कहा जाता है, को एसैडल आर पैकेज में लागू किया जाता है और यहां मैं कुछ उदाहरण देता हूं।
एक साधारण अविभाज्य उदाहरण के रूप में, एक घनत्व का अनुमान लगाने के लिए ईएसए का उपयोग करने पर विचार करें ।
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)
फिट बहुत अच्छा है।
Kjetil के महान जवाब के लिए धन्यवाद मैं खुद एक छोटे से उदाहरण के साथ आने की कोशिश कर रहा हूं, जिस पर मैं चर्चा करना चाहूंगा क्योंकि यह एक प्रासंगिक बिंदु उठाता है:
वितरण पर विचार करें । और इसका व्युत्पन्न यहां पाया जा सकता है और नीचे दिए गए कोड में फ़ंक्शन में पुन: पेश किया जाता है।
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)
approximationerror_unscaled/approximationerror_scaled
25.90798 के आसपास घूमता है