Làm thế nào để phù hợp với một mô hình hỗn hợp với biến trả lời giữa 0 và 1?


15

Tôi đang cố gắng sử dụng lme4::glmer()để phù hợp với mô hình hỗn hợp nhị phân (GLMM) với biến phụ thuộc không phải là nhị phân, mà là biến liên tục giữa 0 và một. Người ta có thể nghĩ về biến này như một xác suất; trong thực tế, đó xác suất được báo cáo bởi các đối tượng của con người (trong một thí nghiệm mà tôi giúp phân tích). Tức là nó không phải là một phần "rời rạc", mà là một biến liên tục.

Cuộc glmer()gọi của tôi không hoạt động như mong đợi (xem bên dưới). Tại sao? Tôi có thể làm gì?

Chỉnh sửa sau: câu trả lời của tôi dưới đây chung chung hơn phiên bản gốc của câu hỏi này, vì vậy tôi đã sửa đổi câu hỏi thành chung chung hơn.


Thêm chi tiết

Rõ ràng có thể sử dụng hồi quy logistic không chỉ cho DV nhị phân mà còn cho DV liên tục giữa 0 và 1. Thật vậy, khi tôi chạy

glm(reportedProbability ~ a + b + c, myData, family="binomial")

Tôi nhận được một tin nhắn cảnh báo

Warning message:
In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!

nhưng một sự phù hợp rất hợp lý (tất cả các yếu tố là phân loại, vì vậy tôi có thể dễ dàng kiểm tra xem các dự đoán mô hình có gần với các phương tiện khác nhau không, và chúng có đúng không).

Tuy nhiên, những gì tôi thực sự muốn sử dụng là

glmer(reportedProbability ~ a + b + c + (1 | subject), myData, family="binomial")

Nó cho tôi cảnh báo giống hệt nhau, trả về một mô hình, nhưng mô hình này rõ ràng là rất nhiều; các ước tính về các hiệu ứng cố định rất xa so với các hiệu ứng glm()và từ các phương tiện xuyên chủ đề. (Và tôi cần đưa glmerControl(optimizer="bobyqa")vào glmercuộc gọi, nếu không thì nó không hội tụ chút nào.)


1
Làm thế nào về việc chuyển đổi các xác suất đầu tiên? Bạn có thể nhận được một cái gì đó gần với phân phối thông thường hơn bằng cách nói, một chuyển đổi logit không? Hoặc arcsin-sqrt? Đó sẽ là sở thích của tôi hơn là sử dụng ánh sáng. Hoặc trong giải pháp hack của bạn, bạn cũng có thể thử thêm một hiệu ứng ngẫu nhiên cho mỗi lần quan sát để giải thích cho sự thiếu hụt do sự lựa chọn của bạn về trọng lượng.
Aaron - Phục hồi Monica

Cảm ơn. Có, tôi có thể đăng nhập DV và sau đó sử dụng mô hình hỗn hợp Gaussian (lmer), nhưng đây cũng là một loại hack và tôi đã đọc rằng nó không được khuyến khích. Tôi sẽ thử một hiệu ứng ngẫu nhiên cho mỗi quan sát! Hiện tại, tôi đang thử mô hình hỗn hợp beta; lme4 không thể xử lý nó, nhưng glmmadmb thì có thể. Khi tôi chạy glmmadmb(reportedProbability ~ a + b + c + (1 | subject), myData, family="beta"), tôi có được sự phù hợp chính xác và khoảng tin cậy hợp lý, nhưng một cảnh báo không hội tụ : - / Cố gắng tìm ra cách tăng số lần lặp. Beta có thể phù hợp với tôi vì tôi không có DV = 0 hoặc DV = 1 trường hợp.
amip nói phục hồi Monica

Tôi không biết về glmer nhưng đối với glm, điều này có thể giúp ích: stats.stackexchange.com/questions/164120/ chủ :

1
@Aaron: Tôi đã thử thêm + (1 | rowid)vào cuộc gọi lấp lánh của mình và điều này mang lại ước tính ổn định và khoảng tin cậy ổn định, không phụ thuộc vào lựa chọn cân nặng của tôi (tôi đã thử 100 và 500). Tôi cũng đã thử chạy lmer trên logit (báo cáoProbability) và tôi nhận được gần như chính xác điều tương tự. Vì vậy, cả hai giải pháp dường như hoạt động tốt! Beta MM với glmmadmb cũng cho kết quả rất gần, nhưng vì một số lý do không thể hội tụ hoàn toàn và mất mãi mãi để chạy. Xem xét đăng một câu trả lời liệt kê các tùy chọn này và giải thích một chút về sự khác biệt và ưu / nhược điểm! (Khoảng tin cậy mà tôi đề cập là tất cả Wald.)
amip nói rằng Rebstate Monica

1
Và họ hoàn toàn chắc chắn về giá trị của họ như 0,9, hay họ cũng có một số '' lề lỗi trên đó ''? Bạn có thể cho rằng sự tự tin được báo cáo bởi các đối tượng khác nhau là chính xác như nhau?

Câu trả lời:


20

Nó có ý nghĩa để bắt đầu với một trường hợp đơn giản hơn không có hiệu ứng ngẫu nhiên.

Có bốn cách để đối phó với biến trả lời không có một liên tục hoạt động giống như một phân số hoặc xác suất ( đây là chủ đề chính / được nâng cấp / xem nhiều nhất của chúng tôi về chủ đề này, nhưng thật không may, cả bốn tùy chọn đều được thảo luận ở đó):

  1. p= =m/nnnN

    glm(p ~ a+b+c, myData, family="binomial", weights=n)
  2. pp01

    betareg(p ~ a+b+c, myData)
  3. Logit biến đổi đáp ứng và sử dụng hồi quy tuyến tính. Điều này thường không được khuyên.

    lm(log(p/(1-p)) ~ a+b+c, myData)
  4. Điều chỉnh mô hình nhị thức nhưng sau đó tính toán các lỗi tiêu chuẩn khi phân tán quá mức vào tài khoản. Các lỗi tiêu chuẩn có thể được tính theo nhiều cách khác nhau:

    • (a) các lỗi tiêu chuẩn được chia tỷ lệ thông qua ước tính vượt mức ( một , hai ). Điều này được gọi là GLM "bán nhị phân".

    • (b) lỗi tiêu chuẩn mạnh mẽ thông qua công cụ ước tính sandwich ( một , hai , ba , bốn ). Điều này được gọi là "logit phân đoạn" trong kinh tế lượng.


    (A) và (b) không giống nhau (xem nhận xét nàycác phần 3.4.1 và 3.4.2 trong cuốn sách này bài SO này và cả bài nàybài này ), nhưng có xu hướng cho kết quả tương tự. Tùy chọn (a) được thực hiện glmnhư sau:

    glm(p ~ a+b+c, myData, family="quasibinomial")

Bốn cách tương tự có sẵn với các hiệu ứng ngẫu nhiên.

  1. Sử dụng weightsđối số ( một , hai ):

    glmer(p ~ a+b+c + (1|subject), myData, family="binomial", weights=n)

    Theo liên kết thứ hai ở trên, có thể là một ý tưởng tốt để mô hình quá mức, xem ở đó (và cả # 4 bên dưới).

  2. Sử dụng mô hình hỗn hợp beta:

    glmmadmb(p ~ a+b+c + (1|subject), myData, family="beta")

    hoặc là

    glmmTMB(p ~ a+b+c + (1|subject), myData, 
            family=list(family="beta",link="logit"))

    Nếu có các số 0 hoặc số chính xác trong dữ liệu phản hồi, thì người ta có thể sử dụng mô hình beta zero / one-thổi phồng trong glmmTMB .

  3. Sử dụng biến đổi logit của phản hồi:

    lmer(log(p/(1-p)) ~ a+b+c + (1|subject), myData)
  4. Kế toán cho sự quá mức trong mô hình nhị thức. Điều này sử dụng một mẹo khác: thêm hiệu ứng ngẫu nhiên cho từng điểm dữ liệu:

    myData$rowid = as.factor(1:nrow(myData))
    glmer(p ~ a+b+c + (1|subject) + (1|rowid), myData, family="binomial",
          glmerControl(optimizer="bobyqa"))

    Vì một số lý do, điều này không hoạt động đúng như glmer()phàn nàn về việc không nguyên pvà đưa ra các ước tính vô nghĩa. Một giải pháp mà tôi đã đưa ra là sử dụng hằng số giả weights=kvà đảm bảo p*kluôn luôn là số nguyên. Điều này đòi hỏi phải làm tròn pnhưng bằng cách chọn kđủ lớn, nó không quan trọng lắm. Các kết quả dường như không phụ thuộc vào giá trị củak .

    k = 100
    glmer(round(p*k)/k ~ a+b+c + (1|subject) + (1|rowid), myData, 
          family="binomial", weights=rowid*0+k, glmerControl(optimizer="bobyqa"))

    Cập nhật sau (tháng 1 năm 2018): Đây có thể là một cách tiếp cận không hợp lệ. Xem thảo luận tại đây . Tôi phải điều tra thêm.


Trong trường hợp cụ thể của tôi, tùy chọn # 1 không có sẵn.

Tùy chọn # 2 rất chậm và có vấn đề với việc hội tụ: glmmadmbmất năm mười phút để chạy (và vẫn phàn nàn rằng nó không hội tụ!), Trong khi lmerhoạt động trong tích tắc và glmermất vài giây. Cập nhật: Tôi đã thửglmmTMB theo đề xuất trong các nhận xét của @BenBolker và nó hoạt động gần như nhanh như glmerkhông có vấn đề hội tụ. Vì vậy, đây là những gì tôi sẽ được sử dụng.

Tùy chọn # 3 và # 4 mang lại ước tính rất giống nhau và khoảng tin cậy Wald rất giống nhau (thu được với confint ). Tôi không phải là một fan hâm mộ lớn của # 3 mặc dù vì đó là loại gian lận. Và # 4 cảm thấy hơi hack.

Rất cảm ơn @Aaron, người đã chỉ cho tôi hướng tới # 3 và # 4 trong bình luận của anh ấy.


1
Câu trả lời hay, giải thích tốt và kết nối với các mô hình không có hiệu ứng ngẫu nhiên. Mặc dù vậy, tôi sẽ không gọi gian lận số 3 (biến đổi), những loại biến đổi đó rất phổ biến trong các phân tích như thế này. Thay vào đó, tôi muốn nói rằng cả # 3 và # 4 đều đưa ra các giả định về mối quan hệ về phân phối dữ liệu, và cả về mối quan hệ giữa giá trị trung bình và phương sai, và chỉ vì # 4 đang mô hình hóa trên thang đo dữ liệu được thu thập không có nghĩa là những giả định đó sẽ tốt hơn.
Aaron - Tái lập Monica

1
# 3 giả định logit của xác suất là bình thường với phương sai không đổi, trong khi # 4 giả định phương sai tỷ lệ với p (1-p). Từ mô tả của bạn về sự phù hợp, những điều này dường như đủ tương tự để không quá quan trọng. Và # 3 gần như chắc chắn là tiêu chuẩn hơn (tùy thuộc vào đối tượng của bạn) vì vậy nếu chẩn đoán hợp lý, đó là điều tôi thích.
Aaron - Phục hồi Monica

1
một khả năng khác là sử dụng glmmTMB ; sau khi cài đặt devtools::install_github("glmmTMB/glmmTMB",sub="glmmTMB"), sử dụng glmmTMB(p ~ a+b+c + (1|subject), myData, family=list(family="beta",link="logit"))sẽ hoạt động ...
Ben Bolker

@BenBolker Cảm ơn! Có bất kỳ lý do để thích glmmTMB hơn glmmADMB (đối với các mô hình beta) hoặc ngược lại? Là một trong những gói gần đây hơn hoặc được phát triển tích cực hơn? Ngoài ra, tôi có thể hỏi cách tiếp cận nào trong số những cách được liệt kê trong câu trả lời này - gaussian glmm sau khi biến đổi logit, beta glmm hoặc binomial glmm với thuật ngữ (1 | rowid) - bạn có thấy thích hợp hơn không?
amip nói rằng Phục hồi Monica

1
Tôi thích GLMM beta nếu khả thi - đó là mô hình thống kê nhằm đo lường sự thay đổi về tỷ lệ giữa các nhóm / nhóm. glmmTMBlà nhanh hơn và ổn định hơn glmmADMB, và dưới (một chút) phát triển tích cực hơn, mặc dù không phải là trưởng thành.
Ben Bolker
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.