Trước tiên, hãy mô phỏng một số dữ liệu cho hồi quy logistic với các phần cố định và ngẫu nhiên:
set.seed(1)
n <- 100
x <- runif(n)
z <- sample(c(0,1), n, replace=TRUE)
b <- rnorm(2)
beta <- c(0.4, 0.8)
X <- model.matrix(~x)
Z <- cbind(z, 1-z)
eta <- X%*%beta + Z%*%b
pr <- 1/(1+exp(-eta))
y <- rbinom(n, 1, pr)
Nếu chúng ta chỉ muốn điều chỉnh hồi quy Logistic không có phần ngẫu nhiên, chúng ta có thể sử dụng glm
hàm:
glm(y~x, family="binomial")
glm(y~x, family="binomial")$coefficients
# (Intercept) x
# -0.2992785 2.1429825
Hoặc xây dựng chức năng riêng của chúng tôi về khả năng đăng nhập
trong đó và
và sử dụng để ước tính các tham số tối đa hóa nó, như sau mã ví dụ:optim()
ll.no.random <- function(theta,X,y){
beta <- theta[1:ncol(X)]
eta <- X%*%beta
p <- 1/(1+exp(-eta))
ll <- sum( y*log(p) + (1-y)*log(1-p) )
-ll
}
optim(c(0,1), ll.no.random, X=X, y=y)
optim(c(0,1), ll.no.random, X=X, y=y)$par
# -0.2992456 2.1427484
tất nhiên đưa ra các ước tính tương tự và tối đa hóa khả năng đăng nhập cho cùng một giá trị. Đối với các hiệu ứng hỗn hợp, chúng tôi sẽ muốn một cái gì đó như
library(lme4)
glmer(y~x + (1|z), family="binomial")
Nhưng làm thế nào chúng ta có thể làm tương tự với chức năng của chúng ta? Vì khả năng là
và tích phân không có biểu thức dạng đóng, chúng ta cần sử dụng tích hợp số như Gaussian Quadrature. Chúng ta có thể sử dụng gói statmod
để có được một số ô tiêu chuẩn, giả sử 10
library(statmod)
gq <- gauss.quad(10)
w <- gq$weights
g <- gq$nodes
CẬP NHẬT: Sử dụng các vị trí cầu phương này và trọng số cho ( ở đây), chúng ta có thể tính gần đúng tích phân trên bằng một tổng các số hạng bằng thay thế cho và toàn bộ thuật ngữ nhân với trọng số tương ứng . Vì vậy, chức năng khả năng của chúng ta nên có ngay bây giờ
Ngoài ra, chúng ta cần tính đến phương sai của phần ngẫu nhiên, tôi đọc rằng điều này có thể đạt được bằng cách thay thế trong hàm của chúng ta bằng trong đó , do đó, trong chức năng khả năng ở trên, chúng tôi thực sự thay thế bằng 'chứ không phải '.
Một vấn đề tính toán mà tôi không nhận được là làm thế nào để thay thế các thuật ngữ vì các vectơ sẽ không có cùng độ dài. Nhưng có lẽ tôi không hiểu điều đó, vì tôi đang thiếu một cái gì đó rất quan trọng ở đây, hoặc hiểu sai về cách thức hoạt động của phương pháp này.