確率モデルとデータ生成過程
このトピックを終えると
観測値の形に応じて Bernoulli、Gaussian、count の構造を区別できるようになります。確率モデルを実際の生物学的機序の確定版としてではなく、観測されたデータがどのように生成されたのかを考えるための仮定として用いることができるようになります。
出発点: 値の形が問いのヒントになる
outcomeが一度きりの成功・失敗なのか、連続的な測定値なのか、一定期間の回数なのかによって、可能なデータ構造は異なります。すべての値を正規分布として扱ったり、すべての正の整数を連続値のように扱ったりすると、データの範囲や変動の構造を見落とすおそれがあります。
確率モデルは、観測値ひとつを説明するためのラベルではありません。どのような値が生じうるのか、条件は何か、変動はどこから生じるのかに関する明示的な仮定です。モデルを選んだ後は、データと仮定がどれだけ整合しているかを点検する必要があります。
三つの構造
Bernoulli: 一度きりの二値の結果
ひとつの観測が二つの結果のいずれかとして記録される構造です。たとえば、定められた基準を満たしたかどうかのように 0 と 1 で表すことができます。このとき値の平均は成功割合として読み取れますが、各観測が何を独立した単位として意味するのかをまず定義しなければなりません。
Gaussian: 連続的な測定値の一つのモデル
連続値がある中心と散らばりの周辺で変動すると仮定する構造です。実際の測定値がこの構造に従うかどうかは、問い・単位・分布の点検によって確認する必要があります。Gaussian という名称は、測定値が必ず釣鐘型であることを保証するものではなく、裾や反復構造を自動的に解決してくれるわけでもありません。
Count: 回数と整数値
一定の観察区間で発生した回数のように、0 以上の整数として記録される構造です。観察時間や曝露量が異なる場合、単純な回数の比較が同じ意味を持つとは限りません。回数、rate、offset の関係は、後の GLM トピックでより具体的に扱います。
データ生成過程として問う
モデルを選ぶ前に、次の文を埋めます。
한 행은 __________________ 단위의 관측이다.
outcome은 __________________ 을 기록한다.
가능한 값의 범위는 __________________ 이다.
변동은 __________________ 와 __________________ 에서 생길 수 있다.
관측 기회 또는 노출량은 __________________ 이다.この文は数式よりも先にデータ構造を固定します。たとえば計数データで観察時間が異なる場合、値の差が事象発生率の差なのか観察機会の差なのかを切り分ける必要があります。
パラメータと観測値を区別する
確率モデルにおいて p、loc、scale、lam のような値は、データを生成する設定またはパラメータの役割を果たします。実際に観測した binary、continuous、counts は、その設定のもとで得られた標本です。両者を区別しないと、一度観察された平均を母集団の固定された真実として読んでしまいます。
たとえば同じ p=0.35 で生成した二つの標本の成功割合は互いに異なり得ます。標本が変わったからです。逆に平均が近いからといって同じ生成構造が保証されるわけでもありません。標本変動とモデルの仮定を区別することが、この後の標本分布を理解する出発点です。
独立性は分布の名前には含まれていない
二つの観測値がBernoulli形式の 0 と 1 を持つからといって、自動的に互いに独立であるとは限りません。同じ生物学的単位、同じbatch、同じ時間の流れから得られた値は共通の変動を持つことがあります。Gaussianまたはcount構造も同様に、値の範囲と独立性は互いに異なる問いです。
したがって、データ生成過程を次のように二つの層に分けて記録します。
값의 형태: binary | continuous | count
관측 관계: 독립 단위 | 반복 측정 | 그룹·시간 구조分布の選択が正しく見えても、観測関係を無視すると標準誤差と不確実性の解釈が変わることがあります。
Pythonでモデルの形をシミュレーションする
分布の形を確認するのに合成データを使うことができます。numpy.random.Generatorで乱数を生成する際は、seedと生成規則を記録します。
import numpy as np
rng = np.random.default_rng(20260806)binary = rng.binomial(n=1, p=0.35, size=100)continuous = rng.normal(loc=5.0, scale=1.2, size=100)counts = rng.poisson(lam=3.0, size=100)
print(binary.min(), binary.max())print(continuous.mean(), continuous.std())print(counts.min(), counts.max())この出力は、三つの構造が取りうる値と合成標本の要約を確認するために使います。一度のシミュレーション結果がモデルの真実を証明するわけではありません。p、loc、scale、lam はこの例の生成設定であり、実際の研究におけるパラメータ推定の結果ではありません。
シミュレーションを変えてみるときは、一度に1つの設定だけを変えます。p を変えると二値アウトカムの成功割合がどのように動くかを見ることができ、scale を変えると中心を保ったまま連続値のばらつきがどう変わるかを見ることができます。lam を変えると count の平均的な大きさと頻度構造が変わります。この実験はモデルの感度を理解するために使うものであり、実際のデータに合うパラメータを自動的に見つけてくれるわけではありません。
乱数 seed を固定すると、同じコードと環境で例を再作成できます。しかし seed の固定は、測定過程、入力データ、ライブラリのバージョン、分析コード全体を固定することと同じ意味ではありません。再現の記録には seed とともに環境 lock、生成コード、データ schema を残します。
モデルと実際の観測の違い
実際のデータには、測定限界、グループ構造、時間、batch、欠測、選択過程が一緒に入り込むことがあります。単純な Gaussian モデルがデータの中心をおおよそ表現していたとしても、独立性や分散構造が合っていない場合があります。
したがって、次を区別します。
- モデルが許容する値の形
- データが実際に示す分布
- 観測単位間の独立性
- モデルが説明できない変動
この差を確認する方法は、モデルの予測またはシミュレーションから期待される形と、実際の観測の範囲・分布・グループ構造を比較することです。比較が食い違ったからといって、ただちに「データが間違っている」と書くことはしません。測定単位、欠測、batch、時間構造、モデル選択を順に点検し直します。
モデルを使うということは、これらすべてを解決したという意味ではなく、どのような仮定を用いたのかを公開するという意味に近いです。
研究の問いに立ち返って解釈する
確率モデルは「この条件が生物学的にこのような機序で作動する」という文ではありません。現在のデータの測定形態と変動を表現するために選択した抽象化です。モデルのパラメータを解釈するには、単位、観測機会、研究デザインとリンク関数を併せて見る必要があります。
誤ったデータ構造に合う計算を精緻に実行しても、結果の解釈は問いから外れることがあります。次回は標本抽出と反復的な標本変動をシミュレーションでつなげます。
よく生じる失敗と点検法
- 連続値であるという理由だけでGaussianを自動的に選択しません。
- 0 と 1 でコーディングしたという理由だけで独立Bernoulliだと断定しません。
- countを観察時間と切り離さずに比較しません。
- 一度のシミュレーション結果を実際の母数の証拠として使いません。
- モデル名が研究デザインの誤りを解決するとは書きません。
要点整理
- outcomeの値の形は、データ生成過程を考える出発点です。
- Bernoulli、Gaussian、countはそれぞれ異なる仮定の構造を表します。
- 確率モデルは生物学的機序の確定ではなく、分析のための抽象化です。
- 合成シミュレーションは、モデルが取りうる形を理解するための道具です。
- 観測単位と変動の構造を確認したうえで、モデルの適合性を点検する必要があります。
次のトピックへ
次回は、一つの標本から計算した値が標本を変えるとどのように揺らぐのかを見ていきます。標本分布と標準誤差をデータ生成過程と結びつけます。
参考資料
- NIST/SEMATECH e-Handbook: https://www.itl.nist.gov/div898/handbook/
- SciPy statistics reference: https://docs.scipy.org/doc/scipy/reference/stats.html
- NumPy Reference: https://numpy.org/doc/stable/reference/
本編のシミュレーション規則と説明は、BioStatPyが独自に作成した教育用の構成です。