📈

割合に対する回帰モデル

2025/01/20に公開

割合など,(0,1)上に定義される量に対する回帰モデルを考える。

出力分布に正規分布を仮定したくない

y \in (0,1)が目的変数である場合、出力に正規分布を仮定するのは避けたい。標本が中央付近に集中しているなら良いが,両端にも観測されていると正規分布のモデルは破綻してしまうかもしれない。具体的には、予測が(0,1)の外にはみ出るかもしれないし、正規分布の等分散の仮定が悪さをするかもしれない。

そんなわけで出力分布にはベータ分布を仮定する。

ベータ分布のパラメータをxの関数で表現する

例えば正規分布ベースの回帰モデルであれば、正規分布の平均パラメータをf(x)で表現する。

同様に,ベータ分布は2種類の形状パラメータ\alpha>0, \beta>0で制御されるので、ベータ回帰モデルの場合は(\alpha,\beta)f(x)で表現すればよいわけだが、そもそも(\alpha,\beta)という形式自体が直感的でない。仮に\alpha=f(x)とおいたとして、f(x)は何を意味するのか?

このままでは後段の分析の品質に影響するので、ちょっとしたトリックを導入して別の定式化を与える。
2種類のパラメータ\mu,\phiを使って\alpha,\betaを変換する。

\alpha = \mu \phi \\ \beta = (1 - \mu) \phi

\mu,\phiについて解くと、

\mu = \frac{\alpha}{\alpha + \beta} \\ \phi = \alpha + \beta

が確認できる。

都合よく\mu = \frac{\alpha}{\alpha + \beta}となったが、これは当にベータ分布の期待値に相当する。よって\mu=f(x)と定義すれば解釈の容易な回帰モデルが得られる。f(x) \in \mathbb{R}であるならば適当にシグモイドでも噛ませておけば良い。

一方\phi = \alpha + \betaについて、これはいわゆる精度パラメータに相当する。ベータ分布の分散は(\mu,\phi)表記で\frac{\mu(1-\mu)}{\phi+1}であるから、\phiが大きくなるほど分布が鋭くなる様子がイメージできる。\phixの関数で表現しても良いが、複雑すぎるので基本的に\phiはハイパラ扱いで良いと思う。

余談だが、ベータ分布の分散が\muに依存するという性質も変換後なら簡単に理解できる。\mu(1-\mu)は0.5で最大となる2次関数なので、ベータ分布は中央の分散が大きく、両端の分散は小さい。

参考までに、Numpyro実装

import jax
import jax.numpy as jnp
import numpyro
import numpyro.distributions as dist

def model(X, y=None):
    num_features = X.shape[1]
    ln_phi = numpyro.sample("ln_phi", dist.StudentT(df=4, loc=0, scale=1))
    weights = numpyro.sample("weights", dist.Normal(0, 10).expand([num_features]))
    intercept = numpyro.sample("intercept", dist.Normal(0, 10))
    mean = jnp.dot(X, weights) + intercept
    with numpyro.plate("data", X.shape[0]):
        mu = jax.nn.sigmoid(mean)
        phi = jnp.exp(ln_phi)
        a = mu * phi
        b = (1 - mu) * phi
        numpyro.sample("obs", dist.Beta(a, b), obs=y)

参考

Discussion