การถดถอยผลผสมแบบไม่เชิงเส้นใน R


14

น่าแปลกที่ฉันไม่พบคำตอบของคำถามต่อไปนี้โดยใช้ Google:

ฉันมีข้อมูลทางชีววิทยาจากบุคคลหลายคนที่แสดงพฤติกรรมการเจริญเติบโต sigmoid คร่าวๆในเวลา ดังนั้นฉันต้องการจำลองโดยใช้การเติบโตโลจิสติกมาตรฐาน

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

ด้วย p0 เป็นค่าเริ่มต้นที่ t = 0, k เป็นขีด จำกัด เชิงเส้นกำกับที่ t-> infinity และ r เป็นความเร็วในการเติบโต เท่าที่ฉันเห็นฉันสามารถจำลองสิ่งนี้ได้อย่างง่ายดายโดยใช้ nls (ขาดความเข้าใจในส่วนของฉัน: ทำไมฉันถึงไม่สร้างแบบจำลองบางอย่างที่คล้ายกันโดยใช้ logit regression แบบมาตรฐานโดยการปรับขนาดเวลาและข้อมูล EDIT: ขอบคุณ Nick สัดส่วน แต่ไม่ค่อยhttp://www.stata-journal.com/article.html?article=st0147 . คำถามต่อไปเกี่ยวกับแทนเจนต์นี้คือถ้าแบบจำลองสามารถจัดการค่าผิดปกติ> 1)

ตอนนี้ฉันต้องการอนุญาตให้แก้ไขบางอย่าง (ส่วนใหญ่เป็นหมวดหมู่) และสุ่มบางอย่าง (ID แต่ละตัวและอาจเป็น ID การศึกษา) ในพารามิเตอร์สามตัวคือ k, p0 และ r nlme เป็นวิธีที่ดีที่สุดในการทำเช่นนี้หรือไม่? รูปแบบ SSlogis ดูเหมือนสมเหตุสมผลสำหรับสิ่งที่ฉันพยายามทำถูกต้องหรือไม่ เป็นหนึ่งในโมเดลที่เหมาะสมที่จะเริ่มต้นด้วยหรือไม่ ฉันไม่สามารถรับค่าเริ่มต้นที่ถูกต้องและอัปเดต () ดูเหมือนว่าจะใช้งานกับเอฟเฟกต์แบบสุ่มเท่านั้นไม่ใช่แบบคงที่ - มีคำแนะนำใด ๆ

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

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


2
หากคุณถือว่า k เป็นที่รู้จักคุณสามารถปรับขนาดประชากรของคุณตาม P / k หาก k เป็นสิ่งที่ต้องประเมินนั่นเพียงอย่างเดียวหมายความว่าปัญหาของคุณไม่ใช่การถดถอยแบบ logit มาตรฐาน
Nick Cox

1
ขอบคุณนิค ใช่ในที่สุดฉันเชื่อว่าจะต้องมีการประมาณ k และรวมอยู่ในการถดถอย ความสนใจของฉันในการใช้การถดถอยแบบ logit เป็นเรื่องทางวิชาการล้วนๆ ฉันคิดว่านี่อาจเป็นแบบอย่างที่ดีที่จะเริ่มต้นก่อนที่จะทำการสร้างแบบจำลองที่ไม่ใช่เชิงเส้น แต่ฉันไม่สามารถหาตัวอย่างใด ๆ สำหรับการถดถอยแบบ logit สำหรับข้อมูลที่ไม่ใช่ไบนารีโดยใช้ Google ฉันสงสัยว่ามีเหตุผลบางอย่าง (เช่นสมมติฐานเกี่ยวกับข้อผิดพลาดกระจาย) ซึ่งทำให้เป็นความคิดที่ไม่ถูกต้องที่จะใช้เช่น glmer ที่มีลิงก์ logit พร้อมข้อมูลต่อเนื่อง
Rob Hall

3
การสร้างแบบจำลอง Logit สำหรับการตอบสนองที่มีสัดส่วนต่อเนื่องได้รับรอบระยะเวลาหนึ่ง แต่ดูเหมือนจะไม่เป็นที่รู้จักกันดี ดูเช่น Baum ในstata-journal.com/sjpdf.html?articlenum=st0147อย่างไรก็ตามไม่ใช่สถานการณ์ของคุณ ฉันไม่สามารถแสดงความคิดเห็นในการใช้งาน R
Nick Cox

ขอบคุณ Nick สำหรับลิงก์ที่น่าสนใจนี้ซึ่งช่วยบอกบางอย่างให้ฉัน น่าเศร้าที่ฉันยังไม่สามารถตอบสนองการตอบกลับของคุณได้ (ในกรณีที่ผู้คนมีปัญหาในการเข้าถึงลิงก์โดยตรงสิ่งต่อไปนี้ใช้ได้กับฉัน: stata-journal.com/article.html?article=st0147 )
Rob Hall

1
การเติบโตของโลจิสติกหมายถึงเส้นโค้งที่เพิ่มขึ้นแบบโมโนโทนิ หากข้อมูลไม่ตรงกันคุณจะได้รับข้อมูลที่ไม่เหมาะสมหรือซอฟต์แวร์จะไม่เล่นขึ้นอยู่กับสิ่งที่คุณทำ
Nick Cox

คำตอบ:


12

ฉันต้องการแบ่งปันบางสิ่งที่ฉันเรียนรู้ตั้งแต่ถามคำถามนี้ nlme ดูเหมือนจะเป็นวิธีที่สมเหตุสมผลในการสร้างเอฟเฟกต์แบบไม่ผสมเชิงเส้นในอาร์เริ่มต้นด้วยแบบจำลองพื้นฐานอย่างง่าย:

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
)

จากนั้นใช้การอัปเดตเพื่อเพิ่มความซับซ้อนของแบบจำลอง พารามิเตอร์เริ่มต้นนั้นยุ่งยากเล็กน้อยในการทำงานด้วยอาจต้องใช้การแก้ไขเพื่อหาคำสั่ง สังเกตว่าเอฟเฟกต์คงที่ใหม่สำหรับ var1 บน Asym เป็นอย่างไรต่อไปนี้กับเอฟเฟกต์คงปกติสำหรับ 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 ดูแข็งแกร่งขึ้นเมื่อเทียบกับค่าผิดปกติในชุดข้อมูลของฉันและดูเหมือนจะนำเสนอคอนเวอร์เจนซ์ที่เชื่อถือได้มากขึ้นสำหรับโมเดลที่ซับซ้อนมากขึ้น อย่างไรก็ตามดูเหมือนว่าข้อเสียคือจำเป็นต้องระบุฟังก์ชันความน่าจะเป็นที่เกี่ยวข้องด้วยตนเอง ต่อไปนี้เป็นโมเดลการเติบโตโลจิสติกที่มีผลคงที่ของ var1 (ไบนารี) บน Asym คุณสามารถเพิ่มเอฟเฟกต์คงที่ใน xmid และ scal scal ในแบบเดียวกัน สังเกตวิธีแปลก ๆ ในการระบุตัวแบบโดยใช้สูตรสองสูตรเป็นผลลัพธ์ ~ เอฟเฟกต์ถาวร ~ เอฟเฟกต์แบบสุ่ม

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
ขอบคุณ Rob สำหรับโพสต์ของคุณจริงๆแล้วมันเป็นสิ่งที่ฉันพยายามทำกับข้อมูลของฉัน ฉันไม่เข้าใจว่า var1 ใน nestedModel บน Asym คืออะไรและคุณคำนวณอย่างไร

นี่เป็นเพียงตัวอย่างเกี่ยวกับวิธีรวมผลกระทบของตัวแปรบางตัวใน Asym: "ต่อไปนี้เป็นตัวแบบการเติบโตโลจิสติกที่มีผลคงที่ของ var1 (ไบนารี) บน Asym" ตัวอย่างเช่นคุณมีตัวแปร "Treated" ที่มีสองค่า 0 และ 1 ดังนั้นให้แทนที่ "Treated" สำหรับ "var1"
PA6OTA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.