Khoảng tin cậy 95% về dự đoán mô hình nhị thức bị kiểm duyệt ước tính bằng mle2 / khả năng tối đa


7

Tôi đang nghiên cứu một vấn đề trong đó tôi có nhiều cặp con đực hiện đang sống imà mỗi nithế hệ có tổ tiên được cho là thế hệ trước (dựa trên bằng chứng phả hệ) và nơi tôi có thông tin về việc có sự không phù hợp trong kiểu gen nhiễm sắc thể Y của chúng hay không thừa hưởng,xi= 1 cho không khớp, 0 nếu có khớp). Nếu không có sự không phù hợp, họ thực sự có một tổ tiên chung, nhưng nếu có một kink trong chuỗi là kết quả của một hoặc nhiều vấn đề ngoài hôn nhân (tôi chỉ có thể phát hiện ra dù có hoặc không ít nhất một sự kiện quan hệ cha con thêm như vậy đã xảy ra, tức là biến phụ thuộc được kiểm duyệt). Điều tôi quan tâm là đạt được ước tính khả năng tối đa (cộng với giới hạn tin cậy 95%) không chỉ ở tỷ lệ quan hệ cha con ngoài cặp (EPP) trung bình (xác suất mỗi thế hệ một đứa trẻ sẽ được sinh ra từ giao hợp cặp đôi), nhưng cũng để cố gắng suy luận làm thế nào tỷ lệ quan hệ cha con thêm có thể thay đổi theo chức năng của thời gian (vì nr của các thế hệ tách biệt tổ tiên chung nên có một số thông tin về điều này - khi có sự không phù hợp tôi không ' Mặc dù không biết khi nào các EPP sẽ xảy ra, vì nó có thể là bất cứ nơi nào giữa thế hệ của tổ tiên được cho là và hiện tại, nhưng khi có một trận đấu, chúng tôi chắc chắn không có EPP nào trong các thế hệ trước). Do đó, cả biến nhị thức phụ thuộc và thế hệ / thời gian đồng biến độc lập của tôi đều bị kiểm duyệt. Dựa trên một vấn đề tương tự được đăngỞ đây tôi đã tìm ra làm thế nào tôi có thể ước tính khả năng tối đa của dân số và tỷ lệ sinh con ngoài cặp trung bình phatcộng với thời gian cộng với 95% khoảng tin cậy trong hồ sơ như sau:

# Function to make overall ML estimate of EPP rate p plus 95% profile likelihood confidence intervals, 
# taking into account that for pairs with mismatches multiple EPP events could have occured
#
# input is 
#     x=vector of booleans or 0 and 1s specifying if there was a mismatch or not (1 or TRUE = mismatch)
#     n=vector with nr of generations that separate common ancestor
# output is mle2 maximum likelihood fit with best-fit param EPP rate p

estimateP = function(x, n) {
  if (!is.logical(x[[1]])) x = (x==1)
  neglogL = function(p, x, n)  -sum((log(1 - (1-p)^n))[x]) -sum((n*log(1-p))[!x]) # negative log likelihood, see see /stats/152111/censored-binomial-model-log-likelihood
  require(bbmle)
  fit = mle2(neglogL, start=list(p=0.01), data=list(x=x, n=n))
  return(fit)
}

Ví dụ với một số dữ liệu thí điểm (từ Larmuseau et al. ProcB 2010 ):

n = c(7, 7, 7, 7, 7, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 27, 31) # number of generations/meioses that separate presumed common paternal ancestor
x = c(rep(0,6), 1, rep(0,7), 1, 1, 1, 0, 1, rep(0,20), 1, rep(0,13), 1, 1, rep(0,5)) # whether pair of individuals had non-matching Y chromosomal genotypes

Ước tính khả năng tối đa của dân số và tỷ lệ sinh con thêm cặp trung bình theo thời gian cộng với giới hạn tin cậy 95%:

fit = estimateP(x,n)
c(coef(fit),confint(fit))*100 # estimated p and profile likelihood confidence intervals
#           p     2.5 %    97.5 % 
#   0.9415172 0.4306652 1.7458847

tức là 0,9% [0,43-1,75% 95% CL] của tất cả trẻ em có nguồn gốc từ một người cha khác với người được cho là.

Sau đó, tôi muốn tiến thêm một bước, và cũng cố gắng ước tính xu hướng thời gian có thể có trong tỷ lệ làm cha thêm cặp pnhư là một chức năng của thế hệ ni(để đơn giản giả sử mối quan hệ tuyến tính giữa tỷ lệ đăng nhập quan sát sự kiện quan hệ cha con thêm và thế hệ), có tính đến việc nếu xảy ra sự không phù hợp thì các sự kiện EPP có thể xảy ra ở bất cứ đâu giữa thế hệ của tổ tiên chung nivà hiện tại (thế hệ 0), và nếu không có sự không phù hợp nào thì không có sự kiện EPP nào có thể xảy ra bất kỳ thế hệ trước nào cho cặp cá nhân cụ thể đó.

Nếu trước đó, chúng tôi giả sử xác suất một đứa trẻ có nguồn gốc từ một cặp giao hợp là không đổi và nếu là biến ngẫu nhiên bằng khi quan sát thấy sự không khớp của nhiễm sắc thể Y (tương ứng với 1 hoặc nhiều sự kiện EPP) và mặt khác, xác suất quan sát không có sự không phù hợp (nghĩa là ) khi tổ tiên của người cha sống cách đây thế hệ ( ) là , trong khi cơ hội của quan sát một sự kiện EPP làpX10X=0nn=1,2,3,(1p)n

Pr(X=1|n)=1(1p)n.

Trong một tập dữ liệu về các quan sát độc lập của với tổ tiên sống của họ thế hệ trướcx=(x1,x2,)Xn=(n1,n2,)

L(p;x,n)=xi=1(1(1p)ni)xj=0(1p)nj,

dẫn đến khả năng đăng nhập

Λ(p)=xi=1log(1(1p)ni)+xj=0njlog(1p).

Có tính đến việc trong mô hình phức tạp hơn của tôi kết hợp động lực học thời gian, tôi muốn là hàm của bây giờ, với , tức là pn

log(p/(1p))=a+b.n
p(a,b,n)=exp(a+b.n)/(1+exp(a+b.n))

Sau đó tôi đã thay đổi định nghĩa của hàm khả năng ở trên cho phù hợp và tối đa hóa nó bằng cách sử dụng hàm mle2từ gói bbmle:

# ML estimation, assuming that EPP rate p shows a temporal trend
# where log(p/(1-p))=a+b*n
# input is 
#     x=vector of booleans or 0 and 1s specifying if there was a mismatch or not (1 or TRUE = mismatch)
#     n=vector with nr of generations that separate common ancestor
# output is mle2 maximum likelihood fit with best-fit params a and b

estimatePtemp = function(x, n) {
  if (!is.logical(x[[1]])) x = (x==1)
  pfun = function(a, b, n) exp(a+b*n)/(1+exp(a+b*n)) # we now write p as a function of a, b and n
  logL = function(a, b, x, n)  sum((log(1 - (1-pfun(a, b, n))^n))[x]) + 
    sum((n*log(1-pfun(a, b, n)))[!x]) # a and b are params to be estimated, modified from /stats/152111/censored-binomial-model-log-likelihood
  neglogL = function(a, b, x, n)  -logL(a, b, x, n) # negative log-likelihood
  require(bbmle)
  fit = mle2(neglogL, start=list(a=-3, b=-0.1), data=list(x=x, n=n))
  return(fit)
}

# fitted coefficients
estfit = estimatePtemp(x, n)
cbind(coef(estfit),confint(estfit)) # parameter estimates and profile likelihood confidence intervals
#                      2.5 %      97.5 %
#   a -3.09054167 -5.3191406 -1.12078519
#   b -0.09870851 -0.2396262  0.02848305
summary(estfit)
# Coefficients:
#      Estimate Std. Error z value    Pr(z)   
#   a -3.090542   1.057382 -2.9228 0.003469 **
#   b -0.098709   0.067361 -1.4654 0.142819   

Điều này mang lại cho tôi một ước tính lịch sử tìm kiếm hợp lý về sự phát triển của tỷ lệ EPP theo thời gian:p

pfun = function(a, b, n) exp(a+b*n)/(1+exp(a+b*n)) 
xvals=1:max(n)
par(mfrow=c(1,1))
plot(xvals,sapply(xvals,function (n) pfun(coef(estfit)[1], coef(estfit)[2], n)), 
     type="l", xlab="Generations ago (n)", ylab="EPP rate (p)")

nhập mô tả hình ảnh ở đây

Tuy nhiên, tôi vẫn còn một chút bế tắc về cách tính khoảng tin cậy 95% trên dự đoán chung của mô hình này. Có ai biết làm thế nào để làm điều đó bằng cơ hội? Có thể sử dụng các khoảng dự đoán dân số (bằng cách lấy lại các tham số theo mức độ phù hợp theo phân phối chuẩn nhiều biến số) (hoặc phương thức delta cũng sẽ hoạt động?)? Và ai đó có thể nhận xét về việc logic của tôi ở trên là chính xác? Tôi cũng tự hỏi liệu loại mô hình nhị thức bị kiểm duyệt này có được biết đến dưới một tên tiêu chuẩn nào đó trong tài liệu không, và liệu có ai biết bất kỳ công trình nào được công bố để thực hiện các loại tính toán ML này theo loại mô hình này không? (Tôi có cảm giác rằng vấn đề phải khá chuẩn và tương ứng với điều gì đó đã được thực hiện, nhưng dường như không thể tìm thấy bất cứ điều gì ...)

[Giấy tờ PS có thêm nền tảng về chủ đề / vấn đề này có sẵn ở đâyđây]


Đầu tiên, tôi sẽ xem xét giới hạn 'giới hạn' của bạn cho các tham số của bạn. Bạn có thể liên tục chọn ngẫu nhiên các tham số trong miền 5% đến 95% và tạo "điểm phù hợp". Sau khi bạn đã thực hiện việc này một số lần, bạn có thể nhận được các thanh lỗi xung quanh xu hướng trung tâm của mình như là một chức năng của các thế hệ trước. Bạn có thể xem xét bootstrap lấy mẫu lại dữ liệu ban đầu của bạn, và chạy lại và sử dụng ước tính đầu ra thay vì lấy mẫu ngẫu nhiên thống nhất.
EngrStudent

Vì vậy, đó là nhiều hay ít những gì B. Bolker gợi ý trong phương pháp khoảng dự đoán dân số này? Tức là liên tục chọn tham số bằng cách sử dụng thư viện (MASS) params.picky = mvrnorm (5000, mu = coef (fit1), Sigma = vcov (fit1)) sau đó thực hiện dự đoán của tôi với những điều này và tính toán lượng tử 95%? Hãy nghĩ rằng tôi hiểu điều đó ngay bây giờ ...
Tom Wenseleers

Câu trả lời:


2

Dựa trên chương và nhận xét của Ben Bolker ở trên, cuối cùng tôi đã hiểu rằng khoảng dự đoán dân số 95% được đưa ra bởi

# predicted EPP rate p as a function of n (nr of generations ago)
# plus 95% population prediction intervals (cf chapter B. Bolker)
pfun = function(a, b, n) exp(a+b*n)/(1+exp(a+b*n)) # model prediction
xvals=1:max(n)
set.seed(1001)
library(MASS)
nresamp=100000
pars.picked = mvrnorm(nresamp, mu = coef(estfit), Sigma = vcov(estfit)) # pick new parameter values by sampling from multivariate normal distribution based on fit
yvals = matrix(0, nrow = nresamp, ncol = length(xvals))
for (i in 1:nresamp) {
  yvals[i,] = sapply(xvals,function (n) pfun(pars.picked[i,1], pars.picked[i,2], n))
}
quant = function(col) quantile(col, c(0.025,0.975)) # 95% percentiles
conflims = apply(yvals,2,quant) # 95% confidence intervals

par(mfrow=c(1,1))
plot(xvals, sapply(xvals,function (n) pfun(coef(estfit)[1], coef(estfit)[2], n)), 
     type="l", xlab="Generations ago (n)", ylab="EPP rate (p)", ylim=c(0,0.05))
lines(xvals, conflims[1,], col="red" , lty=2)
lines(xvals, conflims[2,], col="red" , lty=2)

nhập mô tả hình ảnh ở đây


Thật là một con số thú vị. Sau 20 thế hệ, độ dốc của giới hạn trên 95% trở nên dương. Điều này có thể gợi ý một hành vi định kỳ nếu nó không phải là về sự không chắc chắn được đưa ra bởi các ranh giới.
EngrStudent

1
Không, đó chỉ là do sự không chắc chắn ở gần ranh giới nơi tôi có dữ liệu (hầu hết dữ liệu được tập trung từ 7 đến 20 thế hệ). Nhưng đây chỉ là một tập dữ liệu thí điểm - chúng ta sẽ sớm có một tập dữ liệu lớn hơn khoảng 10 lần.
Tom Wenseleers

Chia sẻ khi bạn hoàn thành. Hay đấy!
EngrStudent
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.