เหตุใด SAS PROC GLIMMIX จึงให้ความชันแบบสุ่มที่แตกต่างกันมากกว่า glmer (lme4) สำหรับ binomial glmm


12

ฉันเป็นผู้ใช้ที่คุ้นเคยกับ R มากขึ้นและพยายามประเมินความลาดแบบสุ่ม (ค่าสัมประสิทธิ์การเลือก) ประมาณ 35 คนตลอด 5 ปีสำหรับตัวแปรที่อยู่อาศัยสี่ตัว ตัวแปรการตอบสนองคือที่อยู่อาศัย "ที่ใช้" (1) หรือ "พร้อมใช้งาน" (0) ที่อยู่อาศัย ("ใช้" ด้านล่าง)

ฉันใช้คอมพิวเตอร์ Windows 64 บิต

ในรุ่น R 3.1.0 ฉันใช้ข้อมูลและการแสดงออกด้านล่าง PS, TH, RS และ HW เป็นเอฟเฟกต์คงที่ (มาตรฐานระยะทางที่วัดได้กับประเภทที่อยู่อาศัย) lme4 V 1.1-7

str(dat)
'data.frame':   359756 obs. of  7 variables:
 $ use     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ Year    : Factor w/ 5 levels "1","2","3","4",..: 4 4 4 4 4 4 4 4 3 4 ...
 $ ID      : num  306 306 306 306 306 306 306 306 162 306 ...
 $ PS: num  -0.32 -0.317 -0.317 -0.318 -0.317 ...
 $ TH: num  -0.211 -0.211 -0.211 -0.213 -0.22 ...
 $ RS: num  -0.337 -0.337 -0.337 -0.337 -0.337 ...
 $ HW: num  -0.0258 -0.19 -0.19 -0.19 -0.4561 ...

glmer(use ~  PS + TH + RS + HW +
     (1 + PS + TH + RS + HW |ID/Year),
     family = binomial, data = dat, control=glmerControl(optimizer="bobyqa"))

glmer ให้การประมาณค่าพารามิเตอร์สำหรับเอฟเฟกต์คงที่ซึ่งสมเหตุสมผลสำหรับฉันและความลาดชันแบบสุ่ม (ซึ่งฉันตีความว่าเป็นสัมประสิทธิ์การเลือกสำหรับที่อยู่อาศัยแต่ละประเภท) ก็สมเหตุสมผลเช่นกันเมื่อฉันตรวจสอบข้อมูลในเชิงคุณภาพ โอกาสในการบันทึกสำหรับรุ่นคือ -3050.8

อย่างไรก็ตามงานวิจัยส่วนใหญ่เกี่ยวกับนิเวศวิทยาของสัตว์ไม่ได้ใช้ R เพราะด้วยข้อมูลตำแหน่งของสัตว์ความสัมพันธ์เชิงพื้นที่สัมพันธ์สามารถทำให้ข้อผิดพลาดมาตรฐานมีแนวโน้มที่จะพิมพ์ผิดพลาดได้ ในขณะที่ R ใช้ข้อผิดพลาดมาตรฐานที่ยึดตามแบบจำลองควรใช้ข้อผิดพลาดมาตรฐานเชิงประจักษ์ (เช่น Huber-white หรือ Sandwich)

ในขณะที่ R ไม่ได้เสนอตัวเลือกนี้ (ตามความรู้ของฉัน - โปรดแก้ไขให้ฉันถ้าฉันผิด), SAS ทำ - แม้ว่าฉันจะไม่สามารถเข้าถึง SAS เพื่อนร่วมงานได้ตกลงที่จะให้ฉันยืมคอมพิวเตอร์เพื่อตรวจสอบว่าข้อผิดพลาดมาตรฐาน เปลี่ยนแปลงอย่างมีนัยสำคัญเมื่อใช้วิธีการทดลอง

อันดับแรกเราต้องการให้แน่ใจว่าเมื่อใช้ข้อผิดพลาดมาตรฐานแบบจำลอง SAS จะสร้างการประมาณการที่คล้ายกันกับ R - เพื่อให้แน่ใจว่าแบบจำลองถูกระบุด้วยวิธีเดียวกันในทั้งสองโปรแกรม ฉันไม่สนใจว่าพวกเขาจะเหมือนกัน - คล้ายกัน ฉันลอง (SAS V 9.2):

proc glimmix data=dat method=laplace;
   class year id;
   model use =  PS TH RS HW / dist=bin solution ddfm=betwithin;
   random intercept PS TH RS HW / subject = year(id) solution type=UN;
run;title;

ฉันลองแบบฟอร์มอื่น ๆ อีกมากมายเช่นการเพิ่มบรรทัด

random intercept / subject = year(id) solution type=UN;
random intercept PS TH RS HW / subject = id solution type=UN;

ฉันพยายามโดยไม่ระบุ

solution type = UN,

หรือแสดงความคิดเห็น

ddfm=betwithin;

ไม่ว่าเราจะระบุรุ่นอย่างไร (และเราลองมาหลายวิธีแล้ว) ฉันไม่สามารถสุ่มลาดใน SAS เพื่อคล้ายกับเอาต์พุตเหล่านั้นจาก R - จากระยะไกลถึงแม้ว่าเอฟเฟกต์คงที่จะคล้ายกัน และเมื่อฉันหมายถึงความแตกต่างฉันหมายถึงว่าแม้จะมีอาการไม่เหมือนกัน โอกาสในการเข้าสู่ระบบ -2 ใน SAS คือ 71344.94

ฉันไม่สามารถอัพโหลดชุดข้อมูลแบบเต็มได้ ดังนั้นฉันจึงสร้างชุดข้อมูลของเล่นที่มีบันทึกจากบุคคลสามคนเท่านั้น SAS ให้ผลลัพธ์ในไม่กี่นาที ใน R ใช้เวลากว่าหนึ่งชั่วโมง แปลก. ด้วยชุดข้อมูลของเล่นนี้ฉันได้รับการประมาณการที่แตกต่างกันสำหรับเอฟเฟกต์คงที่

คำถามของฉัน: ทุกคนสามารถให้ความกระจ่างเกี่ยวกับสาเหตุที่การประมาณค่าความชันแบบสุ่มอาจแตกต่างกันอย่างมากระหว่าง R และ SAS มีอะไรที่ฉันสามารถทำได้ใน R หรือ SAS เพื่อแก้ไขโค้ดของฉันเพื่อให้การโทรนั้นให้ผลลัพธ์ที่คล้ายกัน? ฉันต้องการเปลี่ยนรหัสใน SAS เนื่องจากฉัน "เชื่อ" R ของฉันประมาณมากกว่า

ฉันกังวลกับความแตกต่างเหล่านี้และต้องการไปที่จุดต่ำสุดของปัญหานี้!

เอาต์พุตของฉันจากชุดข้อมูลของเล่นที่ใช้เพียงสามใน 35 บุคคลในชุดข้อมูลแบบเต็มสำหรับ R และ SAS จะรวมอยู่ใน jpegs

เอาต์พุต R SAS เอาต์พุต 1 SAS เอาต์พุต 2 SAS เอาต์พุต 3


แก้ไขและอัปเดต:

เนื่องจาก @JakeWestfall ช่วยให้ค้นพบความลาดชันใน SAS ไม่รวมถึงผลกระทบคงที่ เมื่อฉันเพิ่มเอฟเฟกต์คงที่นี่คือผลลัพธ์ - การเปรียบเทียบความชัน R กับความชัน SAS สำหรับเอฟเฟกต์คงที่หนึ่ง "PS" ระหว่างโปรแกรม: (สัมประสิทธิ์การเลือก = ความชันสุ่ม) บันทึกการเปลี่ยนแปลงที่เพิ่มขึ้นใน SAS

R vs SAS สำหรับ PS


ฉันสังเกตเห็นว่าIDไม่ใช่ปัจจัยใน R; ตรวจสอบและดูว่ามีการเปลี่ยนแปลงอะไร
Aaron ออกจาก Stack Overflow

ฉันเห็นว่าคุณกำลังปรับทั้งสองอย่างโดยใช้ Laplace Approx สำหรับความเป็นไปได้ในการบันทึก คะแนนความน่าจะเป็นในการเข้าสู่ระบบของพวกเขาคืออะไร?
usεr11852

1
คุณตรวจสอบว่าคุณกำลังสร้างโมเดลตัวแปรตามในทิศทางเดียวกันหรือไม่?
Peter Flom - Reinstate Monica

1
โดยวิธีการที่ Peter ได้รับคือโดยค่าเริ่มต้นด้วยข้อมูลทวินามที่ระบุว่าเป็น0s และ1s Rจะจำลองความน่าจะเป็นของการตอบสนอง "1" ในขณะที่ SAS จะจำลองความน่าจะเป็นของการตอบสนอง "0" ที่จะทำให้ SAS รูปแบบน่าจะเป็นของ "1" use(event='1')คุณจะต้องเขียนตัวแปรการตอบสนองของคุณเป็น แน่นอนว่าแม้จะไม่ทำสิ่งนี้ฉันเชื่อว่าเราควรคาดหวังความแตกต่างของเอฟเฟกต์แบบสุ่มเหมือนกันเช่นเดียวกับการประเมินผลคงที่แบบเดียวกันแม้ว่าจะมีสัญญาณกลับกันก็ตาม
Jake Westfall

1
@EricaN สิ่งหนึ่งที่คุณเพียงแค่ทำให้ผมนึกถึงคือการที่คุณควรเปรียบเทียบผลกระทบที่สุ่มจาก R เพื่อผู้ที่อยู่ใน SAS โดยใช้ฟังก์ชั่นมากกว่าranef() coef()อดีตให้เอฟเฟกต์แบบสุ่มจริงขณะที่ส่วนหลังให้เอฟเฟกต์แบบสุ่มพร้อมกับเวกเตอร์เอฟเฟกต์คงที่ ดังนั้นนี่จึงเป็นเหตุผลว่าทำไมตัวเลขที่แสดงในโพสต์ของคุณจึงแตกต่างกัน แต่ยังมีความคลาดเคลื่อนเหลืออยู่มากมายที่ฉันไม่สามารถอธิบายได้ทั้งหมด
Jake Westfall

คำตอบ:


11

ปรากฏว่าผมไม่ควรจะคาดลาดสุ่มจะคล้ายระหว่างแพคเกจตาม Zhang et al, 2011 ในกระดาษของพวกเขาเกี่ยวกับการติดตั้งเชิงเส้นทั่วไปผสมผลรุ่นสำหรับคำตอบไบนารีใช้แพคเกจทางสถิติที่แตกต่างกันพวกเขาอธิบาย:

นามธรรม:

โมเดลเอฟเฟ็กต์การผสมเชิงเส้นทั่วไป (GLMM) เป็นกระบวนทัศน์ที่ได้รับความนิยมในการขยายแบบจำลองสำหรับข้อมูลภาคตัดขวางเป็นการตั้งค่าตามยาว เมื่อนำไปใช้กับการสร้างแบบจำลองการตอบสนองแบบไบนารีแพคเกจซอฟต์แวร์ที่แตกต่างกันและขั้นตอนที่แตกต่างกันภายในแพคเกจอาจให้ผลลัพธ์ที่แตกต่างกันมาก ในรายงานนี้เราอธิบายวิธีการทางสถิติที่รองรับขั้นตอนที่แตกต่างกันเหล่านี้และอภิปรายจุดแข็งและจุดอ่อนของพวกเขาเมื่อนำไปใช้เพื่อให้สอดคล้องกับการตอบสนองแบบไบนารีที่สัมพันธ์กัน จากนั้นเราจะแสดงข้อควรพิจารณาเหล่านี้โดยการใช้ขั้นตอนเหล่านี้นำไปใช้ในชุดซอฟต์แวร์ยอดนิยมบางอย่างกับข้อมูลจำลองและการศึกษาจริง ผลการจำลองสถานการณ์ของเราบ่งชี้ว่าการขาดความน่าเชื่อถือสำหรับกระบวนการส่วนใหญ่ที่พิจารณาซึ่งมีผลกระทบอย่างมีนัยสำคัญสำหรับการใช้แพคเกจซอฟต์แวร์ยอดนิยมดังกล่าวในทางปฏิบัติ

ฉันหวังว่า @BenBolker และทีมงานจะพิจารณาคำถามของฉันเป็นคะแนนสำหรับ R เพื่อรวมข้อผิดพลาดมาตรฐานเชิงประจักษ์และความสามารถในการสร้างพื้นที่สี่เหลี่ยมจัตุรัส Gauss-Hermite สำหรับรุ่นที่มีเงื่อนไขความลาดชันสุ่มหลายแบบเพื่อให้ดูดีขึ้นตามที่ฉันชอบ การวิเคราะห์เพิ่มเติมในโปรแกรมนั้น อย่างมีความสุขแม้ว่า R และ SAS จะไม่มีค่าที่เปรียบเทียบได้สำหรับความชันแบบสุ่ม แต่แนวโน้มโดยรวมก็เหมือนกัน ขอบคุณสำหรับข้อมูลของคุณฉันขอขอบคุณเวลาและการพิจารณาที่คุณใส่ลงไปในสิ่งนี้!


ขออภัย: "ข้อผิดพลาดมาตรฐานมาตรฐาน" คืออะไร คุณหมายถึงข้อผิดพลาดมาตรฐานของส่วนประกอบความแปรปรวนหรือไม่ หรือคุณหมายถึงข้อผิดพลาดมาตรฐานแซนวิช?
Ben Bolker

ขอโทษ ... หมายถึงประจักษ์ / แซนวิช SEs ฉันแก้ไขคำตอบแล้ว
โนวา

@BenBolker สิ่งนี้เคยถูกรวมเข้าด้วยหรือไม่?
Lepidopterist

Nope ฉันพยายามที่จะคิดออกว่าฉันจะสนับสนุนการพัฒนาเช่นนี้เพราะมันไม่ได้เป็นส่วนหนึ่งของโครงการวิจัยของฉัน ...
เบน Bolker

4

ส่วนผสมของคำตอบและความเห็น / คำถามเพิ่มเติม:

ฉันติดตั้งชุดข้อมูล 'ของเล่น' ด้วยตัวเลือกเพิ่มประสิทธิภาพสามแบบที่แตกต่างกัน (* หมายเหตุ 1: มันอาจจะมีประโยชน์สำหรับการเปรียบเทียบเพื่อสร้างชุดข้อมูลขนาดเล็กโดยการ subsampling จากภายในทุกปีและ id มากกว่าโดยการ subsampling ของตัวแปรการจัดกลุ่มเนื่องจากเรารู้ว่า GLMM จะไม่ทำงาน โดยเฉพาะอย่างยิ่งกับระดับตัวแปรการจัดกลุ่มจำนวนน้อยคุณสามารถทำได้ผ่านบางสิ่งเช่น:

library(plyr)
subdata <- ddply(fulldata,c("year","id"),
    function(x) x[sample(nrow(x),size=round(nrow(x)*0.1)),])

รหัสชุด Batch:

Ntoy <- readRDS("Newton_toy.RDS")
library(lme4)
fitfun <- function(opt) {
    tt <- system.time(fit1 <- glmer(use ~  ps + th + rs + hw +
                                    (1 + ps + th + rs + hw |id/year),
                                    family = binomial, data = Ntoy,
                                    control=glmerControl(optimizer=opt),
                                    verbose=100))
    return(list(time=tt,fit=fit1))
}

opts <- c("nloptwrap","nlminbwrap","bobyqa")
## use for() instead of lapply so we can checkpoint more easily
res <- setNames(vector("list",length(opts)),opts)
for (i in opts) {
    res[[i]] <- fitfun(i)
    save("res",file="Newton_batch.RData")
}

จากนั้นฉันอ่านผลลัพธ์ในเซสชั่นใหม่:

load("Newton_batch.RData")
library(lme4)

เวลาที่ผ่านไปและการเบี่ยงเบน:

cbind(time=unname(sapply(res,function(x) x$time["elapsed"])),
          dev=sapply(res,function(x) deviance(x$fit)))
##                time      dev
## nloptwrap  1001.824 6067.706
## nlminbwrap 3495.671 6068.730
## bobyqa     4945.332 6068.731

ความเบี่ยงเบนเหล่านี้ต่ำกว่าความเบี่ยงเบนที่รายงานโดย OP จาก R (6101.7) และต่ำกว่าความเบี่ยงเบนที่รายงานโดย OP จาก SAS (6078.9) เล็กน้อยแม้ว่าการเปรียบเทียบความเบี่ยงเบนข้ามแพ็กเกจจะไม่สมเหตุสมผลเสมอไป

ฉันประหลาดใจจริง ๆ ที่ SAS รวมการประเมินฟังก์ชั่นเพียงประมาณ 100 รายการ!

ระยะเวลาตั้งแต่ 17 นาที ( nloptwrap) ถึง 80 นาที ( bobyqa) ใน Macbook Pro สอดคล้องกับประสบการณ์ของ OP nloptwrapอันซ์เป็นบิตที่ดีกว่าสำหรับ

round(cbind(sapply(res,function(x) fixef(x$fit))),3)
##             nloptwrap nlminbwrap bobyqa
## (Intercept)    -5.815     -5.322 -5.322
## ps             -0.989      0.171  0.171
## th             -0.033     -1.342 -1.341
## rs              1.361     -0.140 -0.139
## hw             -2.100     -2.082 -2.082

คำตอบปรากฏแตกต่างกันมากnloptwrap- แม้ว่าข้อผิดพลาดมาตรฐานจะค่อนข้างใหญ่ ...

round(coef(summary(res[[1]]$fit)),3)
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -5.815      0.750  -7.750    0.000
## ps            -0.989      1.275  -0.776    0.438
## th            -0.033      2.482  -0.013    0.989
## rs             1.361      2.799   0.486    0.627
## hw            -2.100      0.490  -4.283    0.000

(รหัสที่นี่ให้คำเตือนบางอย่างเกี่ยวกับyear:idที่ฉันควรติดตาม)

ยังมีต่อ ... ?


มันจะมีประโยชน์มากขึ้นถ้าฉันส่งชุดข้อมูลแบบเต็มให้คุณหรือไม่ ปัญหาเพียงอย่างเดียวคือการคอนเวอร์เจนซ์ใช้เวลาประมาณ 9 ชั่วโมงกับชุดข้อมูลแบบเต็มดังนั้นข้อเสนอแนะของคุณเกี่ยวกับการสุ่มตัวอย่างเป็นสิ่งที่ดี ฉันพยายามที่จะแปลงข้อมูลด้วยการแปลงบันทึก แต่พล็อตที่เหลือแบบ binned ยังน่าเกลียดคุณคิดว่าพล็อตที่เหลืออธิบายส่วนหนึ่งของปัญหากับข้อมูลเหล่านี้หรือไม่ ในที่สุด - ผลลัพธ์ของคุณใน SAS คล้ายกับ R หรือไม่
โนวา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.