Pertama mari kita mensimulasikan beberapa data untuk regresi logistik dengan bagian-bagian tetap dan acak:
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)
Jika kami hanya ingin menyesuaikan regresi logistik tanpa bagian acak, kami dapat menggunakan glm
fungsi:
glm(y~x, family="binomial")
glm(y~x, family="binomial")$coefficients
# (Intercept) x
# -0.2992785 2.1429825
Atau membangun fungsi kita sendiri dari kemungkinan log
di mana dan
dan gunakan optim()
untuk memperkirakan parameter yang memaksimalkannya, seperti berikut ini contoh kode:
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
yang tentu saja memberikan estimasi yang sama dan memaksimalkan log-likelihood untuk nilai yang sama. Untuk efek campuran, kami ingin sesuatu seperti
library(lme4)
glmer(y~x + (1|z), family="binomial")
Tetapi bagaimana kita dapat melakukan hal yang sama dengan fungsi kita sendiri? Karena kemungkinannya adalah
dan integral tidak memiliki ekspresi bentuk tertutup, kita perlu menggunakan integrasi numerik seperti Gaussian Quadrature. Kita dapat menggunakan paket statmod
untuk mendapatkan beberapa quadratures, katakan 10
library(statmod)
gq <- gauss.quad(10)
w <- gq$weights
g <- gq$nodes
UPDATE: Dengan menggunakan lokasi quadrature ini dan bobot untuk ( sini), kita dapat memperkirakan integral dengan dengan menjumlahkan persyaratan dengan disubstitusi untuk dan keseluruhan istilah dikalikan dengan bobot masing-masing . Jadi, fungsi kemungkinan kita seharusnya sekarang
Juga, kita perlu memperhitungkan varians dari bagian acak, saya membaca bahwa ini dapat dicapai dengan mengganti dalam fungsi kami dengan mana , jadi dalam fungsi kemungkinan di atas kita benar-benar mengganti dengan 'dan bukan .
Satu masalah komputasi yang tidak saya dapatkan adalah bagaimana cara mengganti istilah karena vektor tidak akan memiliki panjang yang sama. Tapi mungkin saya tidak mengerti itu, karena saya kehilangan sesuatu yang penting di sini, atau salah paham bagaimana metode ini bekerja.