วิธีการตรวจสอบส่วนประกอบหลักที่สำคัญโดยใช้วิธีการ bootstrapping หรือวิธีการ Monte Carlo?


40

ฉันสนใจที่จะกำหนดจำนวนของรูปแบบที่สำคัญที่มาจากการวิเคราะห์องค์ประกอบหลัก (PCA) หรือการวิเคราะห์เชิงประจักษ์ฟังก์ชันมุมฉาก (EOF) ฉันสนใจเป็นพิเศษในการใช้วิธีนี้กับข้อมูลสภาพภูมิอากาศ เขตข้อมูลเป็นเมทริกซ์ MxN โดยที่ M เป็นมิติเวลา (เช่นวัน) และ N เป็นมิติข้อมูลเชิงพื้นที่ (เช่นตำแหน่งโลน / ละติจูด) ฉันได้อ่านวิธีบูตสแตรปที่เป็นไปได้เพื่อกำหนดพีซีที่สำคัญ แต่ไม่สามารถหาคำอธิบายโดยละเอียดเพิ่มเติมได้ จนถึงตอนนี้ฉันได้ใช้ Rule of Thumb (North et al ., 1982) ของนอร์ทเพื่อกำหนดทางลัดนี้ แต่ฉันสงสัยว่ามีวิธีการที่แข็งแกร่งกว่านี้หรือไม่

ตัวอย่างเช่น:

###Generate data
x <- -10:10
y <- -10:10
grd <- expand.grid(x=x, y=y)

#3 spatial patterns
sp1 <- grd$x^3+grd$y^2
tmp1 <- matrix(sp1, length(x), length(y))
image(x,y,tmp1)

sp2 <- grd$x^2+grd$y^2
tmp2 <- matrix(sp2, length(x), length(y))
image(x,y,tmp2)

sp3 <- 10*grd$y
tmp3 <- matrix(sp3, length(x), length(y))
image(x,y,tmp3)


#3 respective temporal patterns
T <- 1:1000

tp1 <- scale(sin(seq(0,5*pi,,length(T))))
plot(tp1, t="l")

tp2 <- scale(sin(seq(0,3*pi,,length(T))) + cos(seq(1,6*pi,,length(T))))
plot(tp2, t="l")

tp3 <- scale(sin(seq(0,pi,,length(T))) - 0.2*cos(seq(1,10*pi,,length(T))))
plot(tp3, t="l")


#make data field - time series for each spatial grid (spatial pattern multiplied by temporal pattern plus error)
set.seed(1)
F <- as.matrix(tp1) %*% t(as.matrix(sp1)) + 
as.matrix(tp2) %*% t(as.matrix(sp2)) + 
as.matrix(tp3) %*% t(as.matrix(sp3)) +
matrix(rnorm(length(T)*dim(grd)[1], mean=0, sd=200), nrow=length(T), ncol=dim(grd)[1]) # error term

dim(F)
image(F)


###Empirical Orthogonal Function (EOF) Analysis 
#scale field
Fsc <- scale(F, center=TRUE, scale=FALSE)

#make covariance matrix
C <- cov(Fsc)
image(C)

#Eigen decomposition
E <- eigen(C)

#EOFs (U) and associated Lambda (L) 
U <- E$vectors
L <- E$values

#projection of data onto EOFs (U) to derive principle components (A)
A <- Fsc %*% U

dim(U)
dim(A)

#plot of top 10 Lambda
plot(L[1:10], log="y")

#plot of explained variance (explvar, %) by each EOF
explvar <- L/sum(L) * 100
plot(explvar[1:20], log="y")


#plot original patterns versus those identified by EOF
layout(matrix(1:12, nrow=4, ncol=3, byrow=TRUE), widths=c(1,1,1), heights=c(1,0.5,1,0.5))
layout.show(12)

par(mar=c(4,4,3,1))
image(tmp1, main="pattern 1")
image(tmp2, main="pattern 2")
image(tmp3, main="pattern 3")

par(mar=c(4,4,0,1)) 
plot(T, tp1, t="l", xlab="", ylab="")
plot(T, tp2, t="l", xlab="", ylab="")
plot(T, tp3, t="l", xlab="", ylab="")

par(mar=c(4,4,3,1))
image(matrix(U[,1], length(x), length(y)), main="eof 1") 
image(matrix(U[,2], length(x), length(y)), main="eof 2")
image(matrix(U[,3], length(x), length(y)), main="eof 3")

par(mar=c(4,4,0,1)) 
plot(T, A[,1], t="l", xlab="", ylab="")
plot(T, A[,2], t="l", xlab="", ylab="")
plot(T, A[,3], t="l", xlab="", ylab="")

ป้อนคำอธิบายรูปภาพที่นี่

และนี่คือวิธีที่ฉันใช้เพื่อกำหนดนัยสำคัญของพีซี โดยทั่วไปกฎของหัวแม่มือคือความแตกต่างระหว่าง Lambdas เพื่อนบ้านจะต้องมากกว่าข้อผิดพลาดที่เกี่ยวข้อง

###Determine significant EOFs

#North's Rule of Thumb
Lambda_err <- sqrt(2/dim(F)[2])*L
upper.lim <- L+Lambda_err
lower.lim <- L-Lambda_err
NORTHok=0*L
for(i in seq(L)){
    Lambdas <- L
    Lambdas[i] <- NaN
    nearest <- which.min(abs(L[i]-Lambdas))
    if(nearest > i){
        if(lower.lim[i] > upper.lim[nearest]) NORTHok[i] <- 1
    }
    if(nearest < i){
        if(upper.lim[i] < lower.lim[nearest]) NORTHok[i] <- 1
    }
}
n_sig <- min(which(NORTHok==0))-1

plot(L[1:10],log="y", ylab="Lambda (dots) and error (vertical lines)", xlab="EOF")
segments(x0=seq(L), y0=L-Lambda_err, x1=seq(L), y1=L+Lambda_err)
abline(v=n_sig+0.5, col=2, lty=2)
text(x=n_sig, y=mean(L[1:10]), labels="North's Rule of Thumb", srt=90, col=2)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันพบส่วนของบทโดยBjörnssonและ Venegas ( 1997 ) เกี่ยวกับการทดสอบที่สำคัญที่จะเป็นประโยชน์ - พวกเขาอ้างถึงการทดสอบสามประเภทซึ่งความแปรปรวนที่โดดเด่น - ประเภทอาจเป็นสิ่งที่ฉันหวังว่าจะใช้ การอ้างถึงประเภทของวิธีมอนติคาร์โลในการสับมิติเวลาและคำนวณแลมบ์ดาใหม่ในหลายวิธีเรียงสับเปลี่ยน von Storch และ Zweiers (1999) ยังอ้างถึงการทดสอบที่เปรียบเทียบสเปกตรัมแลมบ์ดากับสเปกตรัม "สัญญาณรบกวน" อ้างอิง ในทั้งสองกรณีฉันไม่แน่ใจว่าจะทำเช่นนี้ได้อย่างไรและการทดสอบที่สำคัญนั้นทำอย่างไรเมื่อได้รับช่วงความเชื่อมั่นที่ระบุโดยการเปลี่ยนลำดับ

ขอบคุณสำหรับความช่วยเหลือของคุณ.

ข้อมูลอ้างอิง: Björnsson, H. และ Venegas, SA (1997) "คู่มือสำหรับการวิเคราะห์ข้อมูลสภาพอากาศของ EOF และ SVD", มหาวิทยาลัย McGill, รายงาน CCGCR หมายเลข 97-1, Montréal, Québec, 52pp http://andvari.vedur.is/%7Efolk/halldor/PICKUP/eof.pdf

GR North, TL Bell, RF Cahalan และ FJ Moeng (1982) ข้อผิดพลาดในการสุ่มตัวอย่างในการประมาณฟังก์ชันเชิงประจักษ์เชิงประจักษ์ จันทร์ Wea รายได้, 110: 699–706

von Storch, H, Zwiers, FW (1999) การวิเคราะห์เชิงสถิติในการวิจัยสภาพภูมิอากาศ สำนักพิมพ์มหาวิทยาลัยเคมบริดจ์


การอ้างอิงของคุณเกี่ยวกับวิธี bootstrap คืออะไร?
Michael Chernick

4
bootstrap จะไม่ทำงานที่นี่ มันจะไม่ทำงานกับชุดข้อมูลที่การสังเกตทุกครั้งมีความสัมพันธ์กับการสังเกตอื่น ๆ มันต้องการความเป็นอิสระหรืออย่างน้อยก็ประมาณความเป็นอิสระ (เงื่อนไขการผสมในอนุกรมเวลาพูด) เพื่อสร้างข้อมูลที่สมเหตุสมผลซ้ำซ้อน แน่นอนว่ามีรูปแบบบูทสแตรปพิเศษเช่นบูทสแตรปไวด์ซึ่งอาจหลีกเลี่ยงปัญหาเหล่านี้ แต่ฉันจะไม่เดิมพันกับสิ่งนี้มากนัก และคุณต้องดูหนังสือสถิติหลายตัวแปรและทำตามพวกเขาเพื่อไม่ให้ได้ไม้ฮอกกี้อีกอันที่แก้ไม่ได้เป็นคำตอบ
StasK

2
@Marc ในกล่องคุณอาจจะอ้างถึง bootstrap บล็อกต่าง ๆ ที่ใช้สำหรับอนุกรมเวลา, MBB (bootstrap บล็อกย้าย) CBB (bootstrap บล็อกวงกลม) หรือ SBB (bootstrap บล็อกนิ่ง) ซึ่งใช้บล็อกเวลาของข้อมูลเพื่อประเมินรูปแบบ พารามิเตอร์
Michael Chernick

3
@StasK ฉันไม่รู้ว่าทำไมคุณคิดว่าคุณต้องมีเงื่อนไขการผสมสำหรับการใช้ bootstrap กับอนุกรมเวลา วิธีการที่ใช้แบบจำลองนั้นต้องการให้คุณพอดีกับโครงสร้างอนุกรมเวลาและจากนั้นคุณสามารถบูตเศษวัสดุเหลือใช้ได้ ดังนั้นคุณสามารถมีอนุกรมเวลาที่มีแนวโน้มและส่วนประกอบตามฤดูกาลและยังคงใช้ bootstrap แบบจำลอง
Michael Chernick

2
ฉันไม่สามารถเข้าถึงข้อความเต็ม แต่คุณสามารถลองดู: "Hamid Babamoradi, Frans van den Berg, Åsmund Rinnan, ขีดจำกัดความเชื่อมั่น Bootstrap ตามการวิเคราะห์องค์ประกอบหลัก - กรณีศึกษา, Chemometrics และระบบห้องปฏิบัติการอัจฉริยะ, เล่ม 120, 15 มกราคม 2556, หน้า 97-105, ISSN 0169-7439, 10.1016 / j.chemolab.2012.10.107. ( sciencedirect.com/science/article/pii/S0169743912002171 ) คำสำคัญ: Bootstrap; PCA; ข้อ จำกัด ด้านความเชื่อมั่น; BC < sub> a </sub>; ความไม่แน่นอน "
tomasz74

คำตอบ:


19

ฉันจะพยายามและบทสนทนาล่วงหน้าที่นี่เล็กน้อยแม้ว่านี่จะเป็นคำถามของฉัน 6 เดือนแล้วที่ฉันถามคำถามนี้และน่าเสียดายที่ไม่มีคำตอบที่สมบูรณ์ฉันจะลองและสรุปสิ่งที่ฉันรวบรวมได้จนถึงตอนนี้และดูว่าใครสามารถอธิบายรายละเอียดเกี่ยวกับปัญหาที่เหลืออยู่ได้ โปรดแก้ตัวคำตอบที่ยาว แต่ฉันไม่เห็นวิธีอื่น ...

ก่อนอื่นฉันจะสาธิตวิธีการหลายวิธีโดยใช้ชุดข้อมูลสังเคราะห์ที่ดีกว่า มันมาจากกระดาษโดย Beckers และ Rixon ( 2003 ) แสดงให้เห็นถึงการใช้อัลกอริทึมสำหรับการดำเนินการ EOF กับข้อมูลที่น่ายินดี ฉันทำซ้ำอัลกอริทึมใน R หากใครสนใจ ( ลิงค์ )

ชุดข้อมูลสังเคราะห์:

#color palette
pal <- colorRampPalette(c("blue", "cyan", "yellow", "red"))

#Generate data
m=50
n=100
frac.gaps <- 0.5 # the fraction of data with NaNs
N.S.ratio <- 0.25 # the Noise to Signal ratio for adding noise to data

x <- (seq(m)*2*pi)/m
t <- (seq(n)*2*pi)/n


#True field
Xt <- 
 outer(sin(x), sin(t)) + 
 outer(sin(2.1*x), sin(2.1*t)) + 
 outer(sin(3.1*x), sin(3.1*t)) +
 outer(tanh(x), cos(t)) + 
 outer(tanh(2*x), cos(2.1*t)) + 
 outer(tanh(4*x), cos(0.1*t)) + 
 outer(tanh(2.4*x), cos(1.1*t)) + 
 tanh(outer(x, t, FUN="+")) + 
 tanh(outer(x, 2*t, FUN="+"))

Xt <- t(Xt)
image(Xt, col=pal(100))

#Noise field
set.seed(1)
RAND <- matrix(runif(length(Xt), min=-1, max=1), nrow=nrow(Xt), ncol=ncol(Xt))
R <- RAND * N.S.ratio * Xt

#True field + Noise field
Xp <- Xt + R
image(Xp, col=pal(100))

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นเขตข้อมูลจริงXtประกอบด้วยสัญญาณ 9 ตัวและฉันได้เพิ่มสัญญาณรบกวนเพื่อสร้างเขตข้อมูลที่สังเกตXpซึ่งจะใช้ในตัวอย่างด้านล่าง EOF ถูกกำหนดเช่น:

EOF

#make covariance matrix
C <- t(Xp) %*% Xp #cov(Xp)
image(C)

#Eigen decomposition
E <- svd(C)

#EOFs (U) and associated Lambda (L) 
U <- E$u
L <- E$d

#projection of data onto EOFs (U) to derive principle components (A)
A <- Xp %*% U

ต่อจากตัวอย่างที่ฉันใช้ในตัวอย่างดั้งเดิมของฉันฉันจะพิจารณา EOF ที่ "สำคัญ" ผ่านกฎง่ายๆของ North

กฎเหนือนิ้วโป้ง

Lambda_err <- sqrt(2/dim(Xp)[2])*L
upper.lim <- L+Lambda_err
lower.lim <- L-Lambda_err
NORTHok=0*L
for(i in seq(L)){
    Lambdas <- L
    Lambdas[i] <- NaN
    nearest <- which.min(abs(L[i]-Lambdas))
    if(nearest > i){
        if(lower.lim[i] > upper.lim[nearest]) NORTHok[i] <- 1
    }
    if(nearest < i){
        if(upper.lim[i] < lower.lim[nearest]) NORTHok[i] <- 1
    }
}
n_sig <- min(which(NORTHok==0))-1
n_sig

plot(L[1:20],log="y", ylab="Lambda (dots) and error (vertical lines)", xlab="EOF")
segments(x0=seq(L), y0=L-Lambda_err, x1=seq(L), y1=L+Lambda_err)
abline(v=n_sig+0.5, col=2, lty=2)
text(x=n_sig, y=mean(L[1:10]), labels="North's Rule of Thumb", srt=90, col=2)

ป้อนคำอธิบายรูปภาพที่นี่

เนื่องจากค่าของแลมบ์ดาที่ 2: 4 อยู่ใกล้กันมากในช่วงกว้างค่าเหล่านี้ถือว่าไม่มีนัยสำคัญโดยกฎของหัวแม่มือ - นั่นคือรูปแบบ EOF ที่เกี่ยวข้องอาจทับซ้อนและผสมกันตามความกว้างที่คล้ายกัน นี่เป็นเรื่องที่โชคร้ายเนื่องจากเรารู้ว่ามีสัญญาณ 9 รายการในสนาม

วิธีอัตนัยมากขึ้นคือการดูค่าแลมบ์ดาแปลงแปลง ("พล็อตหินกรวด") และเพื่อให้พอดีกับการถดถอยกับค่าต่อท้าย หนึ่งสามารถกำหนดค่าแลมบ์ดาที่อยู่เหนือบรรทัดนี้ได้ด้วยสายตา:

พล็อตหินกรวด

ntrail <- 35
tail(L, ntrail)
fit <- lm(log(tail(L, ntrail)) ~ seq(length(L)-ntrail+1, length(L)))
plot(log(L))
abline(fit, col=2)

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้น EOF 5 อันดับแรกจึงอยู่เหนือเส้นนี้ ฉันได้ลองตัวอย่างนี้เมื่อXpไม่มีสัญญาณรบกวนเพิ่มเติมและผลลัพธ์แสดงสัญญาณดั้งเดิมทั้ง 9 รายการ ดังนั้นความไม่แน่นอนของ EOFs 6: 9 นั้นเกิดจากความจริงที่ว่าแอมพลิจูดของพวกเขานั้นต่ำกว่าเสียงในสนาม

วิธีการที่เป็นเป้าหมายมากขึ้นคือเกณฑ์ "Rule N" โดยโอเวอร์แลนด์และพรีเซนเดอร์เฟอร์ (1982) มีการนำไปใช้ภายในwqแพ็คเกจซึ่งฉันแสดงด้านล่าง

กฎ N

library(wq)
eofNum(Xp, distr = "normal", reps = 99)

RN <- ruleN(nrow(Xp), ncol(Xp), type = "normal", reps = 99)
RN
eigs <- svd(cov(Xp))$d
plot(eigs, log="y")
lines(RN, col=2, lty=2)

ป้อนคำอธิบายรูปภาพที่นี่

Rule N ระบุ 4 EOF ที่สำคัญ ส่วนตัวฉันต้องเข้าใจวิธีนี้ดีกว่า; ทำไมมันจึงเป็นไปได้ที่จะวัดระดับของข้อผิดพลาดอยู่บนพื้นฐานของข้อมูลแบบสุ่มที่ไม่ได้ใช้การกระจายเช่นเดียวกับที่ในXp? รูปแบบหนึ่งของวิธีนี้Xpคือการสุ่มข้อมูลใหม่เพื่อให้แต่ละคอลัมน์มีการสุ่มแบบสุ่ม Xpด้วยวิธีนี้เรามั่นใจว่าความแปรปรวนรวมของฟิลด์สุ่มเป็นเช่นเดียวกับ โดยการสุ่มใหม่หลายครั้งเราจะสามารถคำนวณข้อผิดพลาดพื้นฐานของการสลายตัว

Monte Carlo พร้อมฟิลด์สุ่ม (เช่นการเปรียบเทียบแบบจำลอง Null)

iter <- 499
LAMBDA <- matrix(NaN, ncol=iter, nrow=dim(Xp)[2])

set.seed(1)
for(i in seq(iter)){
    #i=1

    #random reorganize dimensions of scaled field
    Xp.tmp <- NaN*Xp
    for(j in seq(dim(Xp.tmp)[2])){
        #j=1
        Xp.tmp[,j] <- Xp[,j][sample(nrow(Xp))]
    }

    #make covariance matrix
    C.tmp <- t(Xp.tmp) %*% Xp.tmp #cov(Xp.tmp)

    #SVD decomposition
    E.tmp <- svd(C.tmp)

    #record Lambda (L) 
    LAMBDA[,i] <- E.tmp$d

    print(paste(round(i/iter*100), "%", " completed", sep=""))
}

boxplot(t(LAMBDA), log="y", col=8, border=2, outpch="")
points(L)

ป้อนคำอธิบายรูปภาพที่นี่

อีกครั้ง 4 EOF อยู่เหนือการแจกแจงสำหรับฟิลด์สุ่ม ความกังวลของฉันเกี่ยวกับวิธีการนี้และของกฎ N คือสิ่งเหล่านี้ไม่ได้ระบุช่วงความเชื่อมั่นของค่าแลมบ์ดาอย่างแท้จริง เช่นค่าแลมบ์ดาแรกที่สูงจะส่งผลให้เกิดความแปรปรวนในระดับต่ำกว่าโดยอัตโนมัติด้วยการติดตามค่า ดังนั้นแลมบ์ดาที่คำนวณจากเขตสุ่มจะมีความชันน้อยกว่าเสมอและอาจส่งผลให้เลือก EOF ที่สำคัญน้อยเกินไป [หมายเหตุ: eofNum()ฟังก์ชั่นถือว่า EOF ถูกคำนวณจากเมทริกซ์สหสัมพันธ์ จำนวนนี้อาจแตกต่างกันหากใช้เมทริกซ์ความแปรปรวนร่วม (ข้อมูลกึ่งกลาง แต่ไม่ปรับขนาด)]

ในที่สุด @ tomasz74 พูดถึงกระดาษโดย Babamoradi et al (2013) ซึ่งฉันได้ดูสั้น ๆ มันน่าสนใจมาก แต่ดูเหมือนว่าจะให้ความสำคัญกับการคำนวณ CI ของโหลด EOF และค่าสัมประสิทธิ์มากกว่าแลมบ์ดา อย่างไรก็ตามฉันเชื่อว่ามันอาจถูกนำมาใช้เพื่อประเมินข้อผิดพลาดของแลมบ์ดาโดยใช้วิธีการเดียวกัน Bootstrap resampling เสร็จแล้วของเขตข้อมูลโดย resampling แถวจนกว่าจะมีการสร้างเขตข้อมูลใหม่ แถวเดียวกันสามารถ resampled มากกว่าหนึ่งครั้งซึ่งเป็นวิธีการที่ไม่ใช้พารามิเตอร์และไม่จำเป็นต้องตั้งสมมติฐานเกี่ยวกับการกระจายของข้อมูล

Bootstrap ของค่าแลมบ์ดา

B <- 40 * nrow(Xp)
LAMBDA <- matrix(NaN, nrow=length(L), ncol=B)
for(b in seq(B)){
    samp.b <- NaN*seq(nrow(Xp))
    for(i in seq(nrow(Xp))){
        samp.b[i] <- sample(nrow(Xp), 1)
    }
    Xp.b  <- Xp[samp.b,]
    C.b  <- t(Xp.b) %*% Xp.b 
    E.b  <- svd(C.b)
    LAMBDA[,b] <- E.b$d
    print(paste(round(b/B*100), "%", " completed", sep=""))
}
boxplot(t(LAMBDA), log="y", col=8, outpch="", ylab="Lambda [log-scale]")
points(L, col=4)
legend("topright", legend=c("Original"), pch=1, col=4)

ป้อนคำอธิบายรูปภาพที่นี่

แม้ว่าสิ่งนี้อาจแข็งแกร่งกว่ากฎง่ายๆของนอร์ ธ ในการคำนวณข้อผิดพลาดของค่าแลมบ์ดา แต่ตอนนี้ฉันเชื่อว่าคำถามความสำคัญของ EOF นั้นมาจากความคิดเห็นที่ต่างกันในความหมายที่ต่างกัน สำหรับกฎของหัวแม่มือและวิธีบูตสแตรปเหนือความสำคัญดูเหมือนจะมากขึ้นโดยพิจารณาว่ามีการทับซ้อนกันระหว่างค่าแลมบ์ดาหรือไม่ หากมีอยู่แล้ว EOF เหล่านี้อาจผสมกันในสัญญาณของพวกเขาและไม่ได้เป็นตัวแทนของรูปแบบ "ของจริง" ในทางตรงกันข้าม EOF สองตัวนี้อาจอธิบายความแปรปรวนจำนวนมาก (เมื่อเทียบกับการสลายตัวของสนามสุ่ม - เช่นกฎ N) ดังนั้นหากใครสนใจกรองสัญญาณรบกวน (เช่นผ่านการตัดทอน EOF) ดังนั้นกฎ N จะเพียงพอ หากใครสนใจกำหนดรูปแบบที่แท้จริงในชุดข้อมูลเกณฑ์ที่เข้มงวดของแลมบ์ดาที่ทับซ้อนกันอาจเข้มงวดกว่านี้

อีกครั้งฉันไม่ใช่ผู้เชี่ยวชาญในปัญหาเหล่านี้ดังนั้นฉันยังหวังว่าคนที่มีประสบการณ์มากกว่าสามารถเพิ่มคำอธิบายนี้

อ้างอิง:

Beckers, Jean-Marie และ M. Rixen "การคำนวณ EOF และการเติมข้อมูลจากชุดข้อมูล Oceanographic ที่ไม่สมบูรณ์" วารสารเทคโนโลยีบรรยากาศและมหาสมุทร 20.12 (2546): 1839-1856

Overland, J. และ R. Preisendorfer, การทดสอบที่สำคัญสำหรับส่วนประกอบหลักที่ใช้กับพายุไซโคลนอุตุนิยมวิทยา, มอญ Wea รายได้, 110, 1-4, 1982

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.