ロジスティック回帰で係数間の関係を強制する方法はありますか?


8

次の関係があるロジスティック回帰モデルを指定したいと思います。

FE[Yi|Xi]=f(βxi1+β2xi2)ここで、は逆ロジット関数です。f

既存のR関数でこれを行う「迅速な」方法はありますか、またはこのようなモデルの名前はありますか?私はロジスティック回帰に使用されるNewton-Raphsonアルゴリズムを変更できることを理解していますが、これは多くの理論的およびコーディング作業であり、ショートカットを探しています。

編集:確率を最大化するためにRのoptim()または他のオプティマイザーを使用して、ポイント推定値を取得することは非常に簡単です。しかし、私はこれらの人の標準エラーが必要です。β


1
あなたがそれをしたいと思っている状況を説明できますか?気になるだけです。私はこれを個人的に見ていないので、おそらく制約付き最適化を使用してコード化する必要があります。
wolfsatthedoor 14

1
私は詳細に入ることができませんが、これをしたいと思う理由は基本的に統計力のためです。この関係が存在すると思われる場合は、モデルにこの関係を強制することで、真の値に近づけることができます。ポイント推定を取得することに関しては、Rでoptim()または他のオプティマイザーを使用して可能性を最大化することは非常に簡単です。しかし、私はこれらの人の標準エラーが必要です。βββ
TrynnaDoStat 14

3
これは見た目ほど難しくありません。単一のパラメーターしかないため、第一原理からMLEを取得するのは非常に簡単です。対数尤度を書き留め、に関してそれを区別します。ゼロを見つけます。それは数値的に行われます。検索の開始に問題がある場合は、通常の2パラメーターモデルを近似し、(たとえば)の係数を開始値として使用します。X 2βx2
whuber

2
SASのNLINプロシージャは、このような非線形回帰式に適合でき、係数stndエラーを出力します。Rと結婚していますか、それとも柔軟性がありますか?
RobertF 14

1
SEを取得することはそれほど難しくありません。これは、パラメータが1つしかない標準理論の簡単なケースです。しかし、パラメータへの依存の非線形の性質を考えると、近似理論または総当たりの数値最適化のいずれかに頼るのは気が進まないでしょう:少なくともいくつかのケースでは、尤度関数自体をプロットして、定性を理解できるようにしますピーク近くの行動。
whuber

回答:


13

これは、Rのoptim関数で簡単に実行できます。私の理解では、yがバイナリの場合、ロジスティック回帰を実行したいと考えています。あなたは単に関数を書いて、それをoptimに固執します。以下は、私が実行しなかったいくつかのコードです(疑似コード)。

#d is your data frame and y is normalized to 0,1
your.fun=function(b)
{

    EXP=exp(d$x1*b +d$x2*b^2)

    VALS=( EXP/(1+EXP) )^(d$y)*( 1/(1+EXP) )^(1-d$y) 
    return(-sum(log(VALS)))
}

result=optim(0,your.fun,method="BFGS",hessian=TRUE)
# estimates 
 result$par
    #standard errors
    sqrt(diag(inv(result$hessian)))
# maximum log likelihood
-result$value

your.funは対数尤度関数の負数であることに注意してください。したがって、optimは対数尤度を最大化します(デフォルトではoptimはすべてを最小化するため、関数を負にしました)。Yがバイナリでない場合は、http ://fisher.osu.edu/~schroeder.9/AMIS900/ch5.pdfにアクセスして、ロジットモデルの多項式および条件付き関数の形式を確認して ください


1
ザカリーの反応に感謝!ただし、見積もりに標準誤差が必要なため、これは機能しません。ブートストラップとoptim()を組み合わせることを考えていますが、可能であれば、非ブートストラップメソッドを使用することをお勧めします。Newton-Raphsonを変更することは、はるかに満足できるものですが、実装するのがはるかに難しいでしょう。
TrynnaDoStat 14

3
理解できないかもしれませんが、推定値の標準誤差は、推定値で評価された最尤ヘッシアンの関数に由来します。関数の記述方法には、パラメーターが1つしかありません。上記のコードをブートストラップして、標準エラーを取得することもできます。
ザカリーブルーメンフェルド

1
@ZacharyBlumenfeld私はあなたが今言っていることを理解しています!MLEの漸近理論についての私の理解は、私たちの観測はiidでなければならないということでしたので、私は混乱しました(平均は確かにここで変化するため、私の観測はiidではありません)。しかし、私は今、観察が特定の規則的な条件の下でiidである必要がないことを知っています(en.wikipedia.org/wiki/Maximum_likelihood#Asymptotic_normality)。今、私は自分の状況が規則性の条件を満たしていることを再確認する必要があります。再度、感謝します!
TrynnaDoStat

1
注:場合、必ずしもではなく、iidと見なされるのはです。ε YY=Xβ+ϵϵY
共役前の

2

上記の答えは正しいです。参考までに、これを計算するための精巧に機能するRコードを次に示します。私は切片を自由に追加しました。おそらくあなたはそれらの1つを望んでいるからです。

## make some data
set.seed(1234)
N <- 2000
x1 <- rnorm(N)
x2 <- rnorm(N)
## create linear predictor
lpred <- 0.5 + 0.5 * x1 + 0.25 * x2
## apply inverse link function
ey <- 1/(1 + exp(-lpred))
## sample some dependent variable
y <- rbinom(N, prob=ey, size=rep(1,N))

dat <- matrix(c(x1, x2, y), nrow=N, ncol=3)
colnames(dat) <- c('x1', 'x2', 'y')

次に、最大化する対数尤度関数を作成します。ここdbinomでは、そこにあるため、結果を合計します。

## the log likelihood function
log.like <- function(beta, dat){
  lpred <- beta[1] + dat[,'x1'] * beta[2] + dat[,'x2'] * beta[2]**2
  ey <- 1/(1 + exp(-lpred))
  sum(dbinom(dat[,'y'], prob=ey, size=rep(1,nrow(dat)), log=TRUE))
}

最尤法でモデルを近似します。勾配を提供したり、最適化方法を選択したりする必要はありませんが、両方を実行したい場合があります。

## fit
res <- optim(par=c(1,1), ## starting values 
             fn=log.like,
             control=list(fnscale=-1), ## maximise not minimise
             hessian=TRUE, ## for SEs
             dat=dat)

結果を見てみましょう。MLパラメータの推定値と漸近SEは次のとおりです。

## results
data.frame(coef=res$par,
           SE=sqrt(diag(solve(-res$hessian))))

これは

##        coef         SE
## 1 0.4731680 0.04828779
## 2 0.5799311 0.03363505

またはバグがあります(これは常に可能です)。

ヘッセ行列から派生した標準誤差に関する通常の警告が適用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.