ฉันจะแสดงวิธีแก้ปัญหาอื่นที่เป็นไปได้ซึ่งค่อนข้างใช้งานได้อย่างกว้างขวางและด้วยซอฟต์แวร์ R ในปัจจุบันค่อนข้างง่าย นั่นคือการประมาณความหนาแน่นของอานม้าซึ่งเป็นที่รู้กันดีว่ากว้างกว่า!
สำหรับคำศัพท์เกี่ยวกับการแจกแจงแกมม่าฉันจะติดตามhttps://en.wikipedia.org/wiki/Gamma_distribution ด้วยการกำหนดรูปร่าง / มาตราส่วนพาราเมตริกคือเป็นพารามิเตอร์รูปร่างและคือสเกล สำหรับการประมาณ saddlepoint ฉันจะติดตาม Ronald W Butler: "การประมาณ Saddlepoint กับแอปพลิเคชัน" (Cambridge UP) การประมาณ saddlepoint อธิบายไว้ที่นี่: การประมาณ saddlepoint ทำงานอย่างไร
ที่นี่ฉันจะแสดงวิธีการใช้งานในแอปพลิเคชันนี้θkθ
ให้เป็นตัวแปรสุ่มที่มีฟังก์ชันสร้างโมเมนต์ที่มีอยู่
ซึ่งต้องมีอยู่สำหรับในช่วงเวลาเปิดที่มีศูนย์ จากนั้นกำหนดฟังก์ชั่นการสร้าง cumulant โดย
เป็นที่รู้จักกันว่า'(0) สมการ saddlepoint คือซึ่งปริยายกำหนดเป็นฟังก์ชันของ (ซึ่งต้องอยู่ในช่วง ) เราเขียนนี้ฟังก์ชั่นที่กำหนดไว้ implicitely เป็น
(x) โปรดทราบว่าสมการ saddlepoint จะมีทางออกเดียวเสมอเพราะฟังก์ชั่น cumulant เป็นแบบนูน M ( s ) = E e s X s K ( s ) = บันทึกX
M( s ) = Eอีs X
sE X = K ′ ( 0 ) , Var ( X ) = K ″ ( 0 ) K ′ (K( s ) = บันทึกM( s )
EX= K'( 0 ) , Var ( X)) = K''( 0 )sxx s (x)K'( s^) = x
sxXs^( x )
จากนั้นประมาณ saddlepoint ความหนาแน่นของจะได้รับจาก
ฟังก์ชันความหนาแน่นโดยประมาณนี้ไม่รับประกันว่าจะรวมเข้ากับ 1 ดังนั้นการประมาณ saddlepoint ที่ผิดปกติ เราสามารถรวมเข้าด้วยกันเป็นตัวเลขและการทำให้เป็นปกติเพื่อให้ได้การประมาณที่ดีขึ้น แต่การประมาณนี้รับประกันว่าจะไม่เป็นลบX ฉ ( x ) = 1fX
f^(x)=12πK′′(s^)−−−−−−−√exp(K(s^)−s^x)
ตอนนี้ขอเป็นแกมมาตัวแปรสุ่มอิสระที่มีการจัดจำหน่ายที่มีพารามิเตอร์theta_i) จากนั้นฟังก์ชั่นการสร้าง cumulant คือ
กำหนดไว้สำหรับtheta_n) อนุพันธ์อันดับแรกคือ
และอนุพันธ์อันดับที่สองคือ
ในต่อไปนี้ฉันจะให้โค้ดที่ใช้ในการคำนวณสิ่งนี้และจะใช้ค่าพารามิเตอร์ , ,X i ( k iX1,X2,…,XnXiK ( s ) = - n ∑ i = 1 k i ln ( 1 - θ i(ki,θi)s < 1 /สูงสุด( θ 1 , θ 2 , … , θ n ) K ′ ( s
K(s)=−∑i=1nkiln(1−θis)
s<1/max(θ1,θ2,…,θn) KK′(s)=∑i=1nkiθi1−θis
n=3k=(1,2,K′′(s)=∑i=1nkiθ2i(1−θis)2.
R
n=3θ = ( 1 , 2 , 3 )k=(1,2,3)θ=(1,2,3). โปรดทราบว่า
R
รหัสต่อไปนี้ใช้อาร์กิวเมนต์ใหม่ในฟังก์ชั่น uniroot ที่นำมาใช้ใน R 3.1 ดังนั้นจะไม่ทำงานใน R ที่เก่ากว่า
shape <- 1:3 #ki
scale <- 1:3 # thetai
# For this case, we get expectation=14, variance=36
make_cumgenfun <- function(shape, scale) {
# we return list(shape, scale, K, K', K'')
n <- length(shape)
m <- length(scale)
stopifnot( n == m, shape > 0, scale > 0 )
return( list( shape=shape, scale=scale,
Vectorize(function(s) {-sum(shape * log(1-scale * s) ) }),
Vectorize(function(s) {sum((shape*scale)/(1-s*scale))}) ,
Vectorize(function(s) { sum(shape*scale*scale/(1-s*scale)) })) )
}
solve_speq <- function(x, cumgenfun) {
# Returns saddle point!
shape <- cumgenfun[[1]]
scale <- cumgenfun[[2]]
Kd <- cumgenfun[[4]]
uniroot(function(s) Kd(s)-x,lower=-100,
upper = 0.3333,
extendInt = "upX")$root
}
make_fhat <- function(shape, scale) {
cgf1 <- make_cumgenfun(shape, scale)
K <- cgf1[[3]]
Kd <- cgf1[[4]]
Kdd <- cgf1[[5]]
# Function finding fhat for one specific x:
fhat0 <- function(x) {
# Solve saddlepoint equation:
s <- solve_speq(x, cgf1)
# Calculating saddlepoint density value:
(1/sqrt(2*pi*Kdd(s)))*exp(K(s)-s*x)
}
# Returning a vectorized version:
return(Vectorize(fhat0))
} #end make_fhat
fhat <- make_fhat(shape, scale)
plot(fhat, from=0.01, to=40, col="red", main="unnormalized saddlepoint approximation\nto sum of three gamma variables")
ส่งผลให้พล็อตต่อไปนี้:
ฉันจะปล่อยให้การประมาณค่าปกติของอานม้าเป็นแบบฝึกหัด