最初に、固定部分とランダム部分を持つロジスティック回帰のデータをシミュレートします。
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)
ランダムな部分がないロジスティック回帰を近似したいだけの場合は、次のglm
関数を使用できます。
glm(y~x, family="binomial")
glm(y~x, family="binomial")$coefficients
# (Intercept) x
# -0.2992785 2.1429825
または、対数尤度の独自の関数を構築する
ここで、および
を使用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
もちろん、どちらも同じ推定値を与え、同じ値の対数尤度を最大化します。混合効果の場合、次のようなものが必要です
library(lme4)
glmer(y~x + (1|z), family="binomial")
しかし、どのように私たち自身の機能で同じことをすることができますか?可能性は
積分には閉形式の式がないため、ガウス求積法のような数値積分を使用する必要があります。パッケージstatmod
を使用して、いくつかの求積を取得できます。たとえば、10
library(statmod)
gq <- gauss.quad(10)
w <- gq$weights
g <- gq$nodes
更新:(ここでは)に対してこれらの求積位置と重みを使用して、代わりにを置換した項の合計によっての積分を概算できます。項にそれぞれの重み掛けたもの。したがって、尤度関数は次のようになります。W 、R、R = 1 、。。。、R R = 10 b j R g r b j w r
また、ランダムな部分の分散を考慮する必要があります。これは、関数のをに置き換えることで達成できることを読みここで、ので、我々上記尤度関数で実際に置き換えるさんとさんとないさん。η σ J θ J θ J〜N (0 、1 )θ G β
ベクトルが同じ長さにならないので、私が得ない計算上の問題の1つは、どのように項を置き換えるかです。しかし、おそらく私はそれを理解していません。私がここで重要な何かを見逃しているか、この方法がどのように機能するかを誤解しているためです。