R'de doğrusal olmayan karışık etkiler regresyonu


14

Şaşırtıcı bir şekilde, Google'ı kullanarak aşağıdaki soruya bir cevap bulamadım:

Birkaç kişiden zaman içinde kabaca sigmoid büyüme davranışı gösteren bazı biyolojik verilerim var. Bu yüzden standart bir lojistik büyüme kullanarak modellemek istiyorum

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

p0, t = 0'da başlangıç ​​değeridir, k, t-> sonsuzda asimptotik sınırdır ve r, büyüme hızıdır. Görebildiğim kadarıyla, bunu nls kullanarak kolayca modelleyebilirim (benim tarafımda anlayış eksikliği: neden zaman ve verileri ölçekleyerek standart logit regresyon kullanarak benzer bir şey modelleyemiyorum? EDIT: Teşekkürler Nick, görünüşe göre insanlar bunu örneğin ancak nadiren http://www.stata-journal.com/article.html?article=st0147 . Bu teğetle ilgili bir sonraki soru, modelin aykırı değerlerin üstesinden gelip gelemeyeceği> 1) olacaktır.

Şimdi k, p0 ve r üç parametresi üzerinde bazı sabit (çoğunlukla kategorik) ve bazı rastgele (bireysel bir kimlik ve muhtemelen bir çalışma kimliği) etkilerine izin vermek istiyorum. Nlme bunu yapmanın en iyi yolu mu? SSlogis modeli yapmaya çalıştığım şeyler için mantıklı görünüyor, doğru mu? Aşağıdakilerden herhangi biri başlamak için mantıklı bir model midir? Başlangıç ​​değerlerini doğru olarak göremiyorum ve update () sadece rastgele efektler için çalışıyor gibi görünüyor, sabit olanlar değil - herhangi bir ipucu?

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))

Özellikle doğrusal olmayan modellerde ve genel olarak doğrusal olmayan modellerde yeni olduğum için, bazı okuma önerilerini veya yeni soruları olan öğretici / SSS bağlantılarını takdir ediyorum.


2
K'yi bilinen olarak görürseniz, popülasyonlarınızı P / k ile ölçeklendirebilirsiniz. Eğer k tahmin edilecek bir şeyse, bu sadece probleminizin standart logit regresyonu olmadığı anlamına gelir.
Nick Cox

1
Teşekkürler Nick. Evet, sonunda k'nin tahmin edilmesi ve regresyona dahil edilmesi gerektiğine inanıyorum. Logit regresyonunu kullanmaya olan ilgim tamamen akademikti. Bunun doğrusal olmayan modellemeye gitmeden önce başlamak için güzel bir model olabileceğini düşündüm, ancak Google kullanarak ikili olmayan veriler için logit regresyonu için herhangi bir örnek bulamadım. Sürekli veri ile bir logit bağlantı ile örneğin glmer kullanmak için kötü bir fikir yapmak bazı neden (örneğin hatalar hakkında dağıtım varsayımları) olup olmadığını merak ediyordum.
Rob Hall

3
Sürekli oranlı yanıtlar için logit modelleme bir süredir var olmakla birlikte, görünüşte iyi bilinmemektedir. Bkz. Örneğin stata-journal.com/sjpdf.html?articlenum=st0147 adresindeki Baum . R uygulamaları hakkında yorum yapamam.
Nick Cox

Bu ilginç bağlantı için Nick'e teşekkür ederim - bu benim için birkaç şeyi temizliyor. Ne yazık ki, yanıtınızı henüz onaylayamıyorum. (İnsanların doğrudan bağlantıya erişmekte sorun yaşaması durumunda, aşağıdakiler benim için çalıştı: stata-journal.com/article.html?article=st0147 )
Rob Hall

1
Lojistik büyüme, monoton yükselen bir eğri anlamına gelir. Veriler eşleşmezse, tam olarak ne yaptığınıza bağlı olarak kötü bir uyum elde edersiniz veya yazılım oynatılmaz.
Nick Cox

Yanıtlar:


12

Bu soruyu sorduğumdan beri öğrendiğim bazı şeyleri paylaşmak istedim. nlme, R'de doğrusal olmayan karışık efektleri modellemenin makul bir yoludur. Basit bir temel modelle başlayı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
)

Ardından model karmaşıklığını artırmak için güncellemeyi kullanın. Başlangıç ​​parametresinin çalışması biraz zor, siparişi bulmak biraz zaman alabilir. Asym'de varl için yeni sabit etkinin Asym için düzenli sabit etkiyi nasıl izlediğine dikkat edin.

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

lme4, veri setimdeki aykırı değerlere karşı daha sağlam görünüyordu ve daha karmaşık modeller için daha güvenilir bir yakınsama sunuyor gibi görünüyordu. Bununla birlikte, dezavantaj, ilgili olasılık fonksiyonlarının manuel olarak belirtilmesi gerektiği gibi görünmektedir. Aşağıdakiler, varim (ikili) 'nin Asym üzerinde sabit etkisi olan lojistik büyüme modelidir. Benzer şekilde xmid ve ölçek üzerine sabit efektler ekleyebilirsiniz. Sonuç ~ sabit etkiler ~ rastgele etkiler olarak çift formül kullanarak modeli belirtmenin garip yoluna dikkat edin.

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
Mesajınız için teşekkür ederim Rob, aslında tam olarak verilerimle yapmaya çalışıyorum. Asym'de nestedModel'de var1 nedir ve nasıl hesapladığınızı anlamıyorum?

Bu sadece bazı değişkenlerin Asym üzerindeki etkisinin nasıl dahil edileceğine bir örnektir: "Aşağıda varl (ikili) 'nin Asym üzerindeki sabit etkisi olan lojistik büyüme modeli yer almaktadır." Örneğin, iki değeri 0 ve 1 olan "İşlem Görmüş" değişkeniniz vardır, bu nedenle "var1" yerine "İşlem Görüldü" ifadesinin yerine koyun.
PA6OTA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.