Mímisbrunnr知恵の泉

← 意思決定分析 一覧

🎓 レベル:発展 | 重要度:B(推奨)

📎 前提:リスク選好と効用の凹凸支配と許容性 | 関連:リスクの測り方(分散・下方リスク)

要点(BLUF)

1. なぜ「効用を特定せずに」順序づけたいか

期待効用と効用関数では、特定の効用関数 uu を決めて期待効用を比べました。しかし uu の正確な形は分からないことが多い。「リスク回避なのは確かだが、w\sqrt{w} なのか logw\log w なのかは不明」。

確率優越は、この不確かさに頑健な順序を与えます。「ある効用クラス(増加・あるいは増加凹)に属するすべての意思決定者が AABB より好む」と言えれば、効用の細部に依存せず AA を選べる。効用を1つに決めずに済む、強い結論です。

2. 一次確率優越(FSD)

AABB一次確率優越(First-order Stochastic Dominance) するとは、累積分布関数(CDF)について

FA(x)FB(x)(すべての x)F_A(x) \le F_B(x) \quad (\text{すべての } x)

が成り立つこと(少なくとも1点で真に小)。FAFBF_A \le F_B は「どの閾値 xx でも、AAxx 以下になる確率の方が小さい=AA は大きい結果が出やすい」を意味します。このとき、増加するあらゆる効用 uuu>0u' > 0)で E[u(A)]E[u(B)]\mathbb{E}[u(A)] \ge \mathbb{E}[u(B)]

import numpy as np

def cdf_on_grid(dist, grid):
    c = np.zeros_like(grid, dtype=float)
    for x, p in dist.items():
        c += p * (grid >= x)
    return c

A = {2: 0.5, 4: 0.5}      # B の各結果に +1 した分布
B = {1: 0.5, 3: 0.5}
grid = np.linspace(-1, 6, 701)
cA, cB = cdf_on_grid(A, grid), cdf_on_grid(B, grid)

fsd = np.all(cA <= cB + 1e-12)
print(f"A={A}, B={B}")
print(f"A が B を一次確率優越(FSD): {fsd}")

出力:

A={2: 0.5, 4: 0.5}, B={1: 0.5, 3: 0.5}
A が B を一次確率優越(FSD): True

出力の意味AABB の各結果に +1 した分布なので、どの結果も BB 以上——当然 FSD が成立します。FSD は支配と許容性の状態支配の確率版で、「中身がどう対応するかは問わず、分布として一方が常に右」という条件。FSD が成り立つなら、効用がどんな増加関数でも(リスク回避でも愛好でも)AA が勝ちます。最も強い優越です。

3. 二次確率優越(SSD)

FSD は強すぎて、滅多に成り立ちません(CDF が交差すると不成立)。リスク回避者に限れば、より緩い二次確率優越(Second-order Stochastic Dominance) で順序がつきます。条件は累積分布の積分

xFA(t)dtxFB(t)dt(すべての x)\int_{-\infty}^{x} F_A(t)\,dt \le \int_{-\infty}^{x} F_B(t)\,dt \quad (\text{すべての } x)

このとき、増加かつ凹(リスク回避)のあらゆる効用E[u(A)]E[u(B)]\mathbb{E}[u(A)] \ge \mathbb{E}[u(B)]。典型は平均保存スプレッド——同じ平均でばらつきが大きい方が SSD で劣る(リスク回避者はばらつきを嫌う)。確実な2と、平均2のばらつくくじを比べます。

import numpy as np

def cdf_on_grid(dist, grid):
    c = np.zeros_like(grid, dtype=float)
    for x, p in dist.items():
        c += p * (grid >= x)
    return c

A = {2: 1.0}              # 確実に2(平均2)
B = {0: 0.5, 4: 0.5}     # 平均2だがばらつく
grid = np.linspace(-1, 6, 701); dx = grid[1]-grid[0]
cA, cB = cdf_on_grid(A, grid), cdf_on_grid(B, grid)

fsd = np.all(cA <= cB + 1e-12) or np.all(cB <= cA + 1e-12)
IA, IB = np.cumsum(cA)*dx, np.cumsum(cB)*dx   # 積分CDF
ssd = np.all(IA <= IB + 1e-9)
print(f"FSD 成立?: {fsd}(CDFが交差して不成立)")
print(f"A が B を二次確率優越(SSD): {ssd}")

# 検証:あらゆるリスク回避(増加凹)効用で A を選好するか
def EU(dist, u): return sum(p*u(x) for x, p in dist.items())
utils = {"sqrt": lambda x: np.sqrt(max(x,0)),
         "log1p": lambda x: np.log(1+max(x,0)),
         "1-exp": lambda x: 1-np.exp(-0.5*x)}
for name, u in utils.items():
    print(f"  {name:6s}: EU(A)={EU(A,u):.4f}  EU(B)={EU(B,u):.4f}")

出力:

FSD 成立?: False(CDFが交差して不成立)
A が B を二次確率優越(SSD): True
  sqrt  : EU(A)=1.4142  EU(B)=1.0000
  log1p : EU(A)=1.0986  EU(B)=0.8047
  1-exp : EU(A)=0.6321  EU(B)=0.4323

出力の意味:FSD は CDF が交差するので不成立(確実な2の方が小さい結果では有利、大きい結果では不利)。しかし SSD は成立し、\sqrt{\cdot}log\log・指数効用のどれでも E[u(A)]>E[u(B)]\mathbb{E}[u(A)] > \mathbb{E}[u(B)]特定の効用を選ばなくても、リスク回避でありさえすれば確実な2を選ぶ——これが SSD の威力です。リスク選好と効用の凹凸の「凹効用はばらつきを嫌う」を、効用を1つに固定せずに言い切った形になっています。

数式の直観的意味:積分の階数が効用クラスに対応

FSD と SSD の違いは、CDF を何回積分して比べるかです。これは効用に課す条件の階数とぴったり対応します。

なぜ対応するか。E[u(A)]E[u(B)]\mathbb{E}[u(A)] - \mathbb{E}[u(B)] を部分積分すると、u(x)[FB(x)FA(x)]dx\int u'(x)\,[F_B(x)-F_A(x)]\,dx となり、u0u'\ge0 なら FAFBF_A\le F_B(FSD)で非負。もう一度部分積分すると積分CDFの差と uu'' が現れ、u0u''\le0(凹)なら積分CDFの順序(SSD)で非負になります。「効用に課す滑らかさの階数」と「分布を積分する回数」が一対一——確率優越の階層は、効用関数の微分の階層を映した鏡です。さらに高階の優越(3次以上)は、慎重性(prudence, u0u'''\ge0)といった選好の性質に対応します。

⚠️ よくある誤解

対応シミュレーション

本文のコードで、分布を変えると FSD/SSD の成否が変わります。CDF が交差する例(FSD 不成立・SSD 成立)と、両方不成立で比較不能になる例を作ると、確率優越が「半順序」であることを体感できます。

関連ノート