Hồi quy hiệu ứng hỗn hợp phi tuyến tính trong R


14

Đáng ngạc nhiên, tôi không thể tìm thấy câu trả lời cho câu hỏi sau bằng Google:

Tôi có một số dữ liệu sinh học từ một số cá nhân cho thấy một hành vi tăng trưởng sigmoid gần đúng thời gian. Vì vậy, tôi muốn mô hình hóa nó bằng cách sử dụng tăng trưởng logistic tiêu chuẩn

P(t) = k*p0*exp(r*t) / (k+p0*(exp(r*t)-1))

với p0 là giá trị bắt đầu tại t = 0, k là giới hạn tiệm cận ở t-> vô cùng và r là tốc độ tăng trưởng. Theo như tôi có thể thấy, tôi có thể dễ dàng mô hình hóa điều này bằng cách sử dụng nls (thiếu hiểu biết về phần tôi: tại sao tôi không thể mô hình hóa một cái gì đó tương tự bằng cách sử dụng hồi quy logit tiêu chuẩn bằng cách thu nhỏ thời gian và dữ liệu? EDIT: Cảm ơn Nick, rõ ràng mọi người làm điều đó tỷ lệ, nhưng hiếm khi http://www.stata-journal.com/article.html?article=st0147 . Câu hỏi tiếp theo về tiếp tuyến này sẽ là nếu mô hình có thể xử lý các ngoại lệ> 1).

Bây giờ tôi muốn cho phép một số hiệu ứng cố định (chủ yếu là phân loại) và một số ngẫu nhiên (ID cá nhân và cũng có thể là ID nghiên cứu) trên ba tham số k, p0 và r. Có phải nlme là cách tốt nhất để làm điều này? Mô hình SSlogis có vẻ hợp lý cho những gì tôi đang cố gắng thực hiện, điều đó có đúng không? Là một trong những mô hình hợp lý sau đây để bắt đầu? Tôi dường như không thể có được các giá trị bắt đầu đúng và update () dường như chỉ hoạt động cho các hiệu ứng ngẫu nhiên, không phải là các giá trị cố định - có gợi ý nào không?

nlme(y ~ k*p0*exp(r*t) / (k+p0*(exp(r*t)-1)), ## not working at all (bad numerical properties?)
            data = data,
            fixed = k + p0 + r ~ var1 + var2,
            random = k + p0 + r ~ 1|UID,
            start = c(p0=1, k=100, r=1))

nlme(y ~ SSlogis(t, Asym, xmid, scal), ## not working, as start= is inappropriate
            data = data,
            fixed = Asym + xmid + scal ~ var1 + var2, ## works fine with ~ 1
            random = Asym + xmid + scal ~ 1|UID,
            start = getInitial(y ~ SSlogis(Dauer, Asym, xmid, scal), data = data))

Vì tôi chưa quen với các mô hình hỗn hợp phi tuyến tính nói riêng và các mô hình phi tuyến tính nói chung, tôi sẽ đánh giá cao một số khuyến nghị đọc hoặc liên kết đến hướng dẫn / Câu hỏi thường gặp với câu hỏi của người mới.


2
Nếu bạn coi k như đã biết, bạn có thể chia tỷ lệ dân số theo P / k. Nếu k là một cái gì đó để ước tính, điều đó một mình có nghĩa là vấn đề của bạn không phải là hồi quy logit tiêu chuẩn.
Nick Cox

1
Cảm ơn Nick. Vâng, cuối cùng tôi tin rằng k cần phải được ước tính và đưa vào hồi quy. Sở thích của tôi trong việc sử dụng hồi quy logit hoàn toàn là học thuật. Tôi nghĩ rằng đây có thể là một mô hình hay để bắt đầu trước khi chuyển sang mô hình phi tuyến tính, nhưng tôi không thể tìm thấy bất kỳ ví dụ nào cho hồi quy logit cho dữ liệu không nhị phân bằng Google. Tôi đã tự hỏi nếu có một số lý do (ví dụ như các giả định phân phối về các lỗi) làm cho nó trở thành một ý tưởng tồi để sử dụng, ví dụ như lấp lánh với một liên kết logit với dữ liệu liên tục.
Hội trường Rob

3
Mô hình hóa logit cho các phản hồi có tỷ lệ liên tục đã có từ lâu, nhưng dường như không được biết đến nhiều. Xem ví dụ Baum trong stata-journal.com/sjpdf.html?articlenum=st0147 Tuy nhiên, đó không phải là tình huống của bạn. Tôi không thể nhận xét về việc triển khai R.
Nick Cox

Cảm ơn Nick vì liên kết thú vị này - điều đó làm sáng tỏ một vài điều cho tôi. Đáng buồn thay, có vẻ như tôi không thể nêu lên phản ứng của bạn. (Trong trường hợp người gặp khó khăn khi truy cập vào liên kết trực tiếp, sau đây làm việc cho tôi: stata-journal.com/article.html?article=st0147 )
Rob Hall

1
Tăng trưởng logistic ngụ ý một đường cong tăng đơn điệu. Nếu dữ liệu không khớp, bạn sẽ có kết quả kém hoặc phần mềm sẽ không phát, tùy thuộc vào chính xác những gì bạn đang làm.
Nick Cox

Câu trả lời:


12

Tôi muốn chia sẻ một số điều tôi học được từ khi đặt câu hỏi này. nlme dường như là một cách hợp lý để mô hình hóa các hiệu ứng hỗn hợp phi tuyến tính trong R. Bắt đầu với một mô hình cơ sở đơn giản:

library(nlme)
data <- groupedData(y ~ t | UID, data=data) ## not strictly necessary
initVals <- getInitial(y ~ SSlogis(t, Asym, xmid, scal), data = data)
baseModel<- nlme(y ~ SSlogis(t, Asym, xmid, scal),
    data = data,
    fixed = list(Asym ~ 1, xmid ~ 1, scal ~ 1),
    random = Asym + xmid + scal ~ 1|UID,
    start = initVals
)

Sau đó sử dụng cập nhật để tăng độ phức tạp của mô hình. Tham số bắt đầu hơi khó để làm việc với nó, có thể cần một số sửa đổi để tìm ra thứ tự. Lưu ý cách hiệu ứng cố định mới cho var1 trên Asym tuân theo hiệu ứng cố định thường xuyên cho Asym.

 nestedModel <- update(baseModel, fixed=list(Asym ~ var1, xmid ~ 1, scal ~ 1), start = c(fixef(baseModel)[1], 0, fixef(baseModel)[2], fixef(baseModel)[3]))

lme4 dường như mạnh mẽ hơn so với các ngoại lệ trong bộ dữ liệu của tôi và dường như cung cấp sự hội tụ đáng tin cậy hơn cho các mô hình phức tạp hơn. Tuy nhiên, có vẻ như nhược điểm là các chức năng khả năng liên quan cần phải được chỉ định bằng tay. Sau đây là mô hình tăng trưởng logistic với hiệu ứng cố định var1 (nhị phân) trên Asym. Bạn có thể thêm các hiệu ứng cố định trên xmid và tỷ lệ theo cách tương tự. Lưu ý cách kỳ lạ chỉ định mô hình bằng cách sử dụng công thức kép làm kết quả ~ hiệu ứng cố định ~ hiệu ứng ngẫu nhiên.

library(lme4) ## careful loading nlme and lme4 concurrently
customLogitModel <- function(t, Asym, AsymVar1, xmid, scal) {
    (Asym+AsymVar1*var1)/(1+exp((xmid-t)/scal))
}

customLogitModelGradient <- deriv(
    body(customLogitModel)[[2]], 
    namevec = c("Asym", "AsymVar1", "xmid", "scal"), 
    function.arg=customLogitModel
)

## find starting parameters
initVals <- getInitial(y ~ SSlogis(t, Asym, xmid, scal), data = data)

# Fit the model
model <- nlmer(
    y ~ customLogitModelGradient(t=t, Asym, AsymVar1, xmid, scal, var1=var) ~ 
    # Random effects with a second ~
    (Asym | UID) + (xmid | UID) + (scal | UID), 
    data = data, 
    start = c(Asym=initVals[1], AsymVar1=0, xmid=initVals[2], scal=initVals[3])
)

1
Cảm ơn Rob vì bài đăng của bạn, đây thực sự chính xác là những gì tôi đang cố gắng thực hiện với dữ liệu của mình. Tôi không hiểu var1 trong NestedModel trên Asym là gì và bạn đã tính nó như thế nào?

Đây chỉ là một ví dụ về cách đưa hiệu ứng của một số biến vào Asym: "Sau đây là mô hình tăng trưởng logistic với hiệu ứng cố định của var1 (nhị phân) trên Asym." Ví dụ: bạn có biến "Đã xử lý" có hai giá trị 0 và 1, vì vậy thay thế "Đã xử lý" cho "var1".
PA6OTA
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.