ฉันกำลังพยายามคำนวณความน่าจะเป็นในการบันทึกสำหรับการถดถอยกำลังสองน้อยที่สุดแบบไม่เชิงเส้นสำหรับฟังก์ชันปรับโดยฟังก์ชั่นในแพคเกจ R โดยใช้เมทริกซ์ความแปรปรวนร่วมแปรปรวนที่สร้างขึ้นโดยระยะทางบนต้นไม้สายวิวัฒนาการที่สมมติว่ามีการเคลื่อนที่แบบบราวเนียน ( จากแพ็คเกจ) รหัส R ที่สามารถทำซ้ำได้ดังต่อไปนี้เหมาะกับรุ่น gnls โดยใช้ข้อมูล x, y และแผนภูมิแบบสุ่มที่มี 9 แท็กซ่า:gnls
nlme
corBrownian(phy=tree)
ape
require(ape)
require(nlme)
require(expm)
tree <- rtree(9)
x <- c(0,14.51,32.9,44.41,86.18,136.28,178.21,262.3,521.94)
y <- c(100,93.69,82.09,62.24,32.71,48.4,35.98,15.73,9.71)
data <- data.frame(x,y,row.names=tree$tip.label)
model <- y~beta1/((1+(x/beta2))^beta3)
f=function(beta,x) beta[1]/((1+(x/beta[2]))^beta[3])
start <- c(beta1=103.651004,beta2=119.55067,beta3=1.370105)
correlation <- corBrownian(phy=tree)
fit <- gnls(model=model,data=data,start=start,correlation=correlation)
logLik(fit)
ผมอยากจะคำนวณความน่าจะเข้าสู่ระบบ "ด้วยมือ" (ใน R แต่ไม่มีการใช้logLik
ฟังก์ชั่น) ตามประมาณค่าพารามิเตอร์ที่ได้รับจากเพื่อให้ตรงกับการส่งออกจากgnls
logLik(fit)
หมายเหตุ: ฉันไม่ได้พยายามประมาณพารามิเตอร์ ฉันแค่ต้องการคำนวณความน่าจะเป็นบันทึกของพารามิเตอร์ที่ประมาณโดยgnls
ฟังก์ชัน (แม้ว่าบางคนมีตัวอย่างที่ทำซ้ำได้ของวิธีการประมาณพารามิเตอร์โดยไม่ต้องgnls
ฉันจะสนใจดูมัน!)
ฉันไม่แน่ใจว่าจะทำสิ่งนี้ได้อย่างไรในอาร์สัญกรณ์พีชคณิตเชิงเส้นที่อธิบายไว้ในตัวแบบผสมเอฟเฟกต์ใน S และ S-Plus (Pinheiro และ Bates) นั้นเหนือกว่าหัวของฉันมากและไม่มีความพยายามlogLik(fit)
ใด ๆ นี่คือรายละเอียดที่อธิบายโดย Pinheiro และ Bates:
บันทึกความเป็นไปได้สำหรับโมเดลกำลังสองแบบไม่เชิงเส้นทั่วไป โดยที่ถูกคำนวณดังนี้:
ที่คือจำนวนของการสังเกตและv_i)
เป็นบวกแน่นอน,และ
สำหรับและคงที่ตัวประมาณค่า ML ของคือ
และประวัติความเป็นไปได้ที่บันทึกไว้คือ
ซึ่งจะใช้กับอัลกอริทึม Gauss-Seidel เพื่อหาสิ่งที่ประมาณการ ML ของและ\ใช้การประมาณที่แคบลงของ :
ที่หมายถึงความยาวของ\
ฉันได้รวบรวมรายการคำถามเฉพาะที่ฉันพบ:
- คืออะไร ? มันเป็นเมทริกซ์ระยะทางที่ผลิตโดยในหรือไม่ก็จะต้องมีการเปลี่ยนอย่างใดหรือแปรโดยหรือสิ่งอื่นทั้งหมด?
big_lambda <- vcv.phylo(tree)
ape
- หากว่า BE หรือสมการสำหรับการประมาณการลำเอียงน้อย (สมการที่ผ่านมาในโพสต์นี้)?
fit$sigma^2
- จำเป็นหรือไม่ที่จะต้องใช้เพื่อคำนวณความน่าจะเป็นของล็อกหรือเป็นเพียงขั้นตอนกลางสำหรับการประมาณค่าพารามิเตอร์? นอกจากนี้ยังเป็นวิธีที่ใช้? มันเป็นค่าเดียวหรือเวกเตอร์และมันถูกคูณด้วยหรือแค่องค์ประกอบนอกแนวทแยงมุม ฯลฯ ?
- คืออะไร? จะอยู่ในแพ็คเกจหรือไม่ ถ้าเป็นเช่นนั้นฉันสับสนเกี่ยวกับวิธีการคำนวณผลรวมเนื่องจากคืนค่าเดียวไม่ใช่ เวกเตอร์M ∑ i = 1 | | y ∗ i - f ∗ i ( β ) | | 2
norm(y-f(fit$coefficients,x),"F")
Matrix
norm()
- วิธีหนึ่งคำนวณ? มันเป็นเรื่องที่เป็นหรือมันคือจากแพคเกจ? ถ้าเป็นเช่นนั้นเราจะหาผลรวมของเมทริกซ์ได้อย่างไร (หรือมันบอกเป็นนัยว่ามันเป็นเพียงองค์ประกอบในแนวทแยงมุม)Λ ฉัน
log(diag(abs(big_lambda)))
big_lambda
logm(abs(big_lambda))
expm
logm()
- เพียงเพื่อยืนยันการเป็นคำนวณเช่นนี้?
t(solve(sqrtm(big_lambda)))
- วิธีการที่และคำนวณอย่างไร มันเป็นอย่างใดอย่างหนึ่งต่อไปนี้: f ∗ ฉัน ( β )
y_star <- t(solve(sqrtm(big_lambda))) %*% y
และ
f_star <- t(solve(sqrtm(big_lambda))) %*% f(fit$coefficients,x)
หรือมันจะเป็น
y_star <- t(solve(sqrtm(big_lambda))) * y
และ
f_star <- t(solve(sqrtm(big_lambda))) * f(fit$coefficients,x)
?
logLik(fit)
หากทุกคำถามเหล่านี้มีคำตอบในทางทฤษฎีผมคิดว่าน่าจะเข้าสู่ระบบควรจะคำนวณเพื่อให้ตรงกับการส่งออกจาก ความช่วยเหลือใด ๆ ของคำถามเหล่านี้จะได้รับการชื่นชมอย่างมาก หากมีสิ่งใดที่ต้องการคำชี้แจงกรุณาแจ้งให้เราทราบ ขอบคุณ!
UPDATE : ฉันได้ทดลองกับความเป็นไปได้ต่าง ๆ สำหรับการคำนวณความน่าจะเป็นและนี่คือสิ่งที่ดีที่สุดที่ฉันได้ค้นพบ logLik_calc
ประมาณ 1 ถึง 3 จากค่าที่ส่งคืนโดยlogLik(fit)
สม่ำเสมอ ไม่ว่าฉันจะใกล้เคียงกับการแก้ปัญหาจริงหรือนี่คือความบังเอิญ ความคิดใด ๆ
C <- vcv.phylo(tree) # variance-covariance matrix
tC <- t(solve(sqrtm(C))) # C^(-T/2)
log_C <- log(diag(abs(C))) # log|C|
N <- length(y)
y_star <- tC%*%y
f_star <- tC%*%f(fit$coefficients,x)
dif <- y_star-f_star
sigma_squared <- sum(abs(y_star-f_star)^2)/N
# using fit$sigma^2 also produces a slightly different answer than logLik(fit)
logLik_calc <- -((N*log(2*pi*(sigma_squared)))+
sum(((abs(dif)^2)/(sigma_squared))+log_C))/2