ただのメモ

他の人に見せても良い方のメモ

”Measures of Risk"をなぞる

  • こちらをなぞる。
  •  2かける2の表があったとします。
    • 一行目は、暴露群
    • 二行目は、非暴露群
    • 一列目は、事象の起こった群
    • 二列目は、事象の起こらなかった群
  • リスク
    • リスクとは、事象の数を、総数で割った数
      • 故に、0から1の数(有理数
      • 暴露群にも、非暴露群にもリスクがある
  • 相対リスク
    • 暴露群のリスクを、非暴露群のリスクで割った数
    • 1より大きいか、小さいか
      • これは、暴露群のリスクと非暴露群のリスクの大小関係を知りたい時に役に立つ
      • 大小関係を知ると、暴露されたことの良し悪しが分かる
    • 95%信頼区間
      • 大きなサンプル数の時
      • 対数を取る
    • 相対リスク差
    • 絶対リスク差
    • number needed to treat
      • 1人分だけ、差が出るような人数

絵描き。

import math
class Risk:
  def __init__(self,a,b,c,d):
    self.a = a
    self.b = b
    self.c = c
    self.d = d

  def risk_exp(self):
    return self.a/(self.a+self.b)
  def risk_unexp(self):
    return self.c/(self.c+self.d)
  def relative_risk(self):
    return self.risk_exp()/self.risk_unexp()
  def CI(self):
    var = 1/self.a - 1/(self.a+self.c) + 1/self.b - 1/(self.b+self.d)
    lower = math.exp(-1.96 * var + math.log(self.relative_risk()))
    upper = math.exp( 1.96 * var + math.log(self.relative_risk()))
    return [lower, upper]

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(111,projection = "3d")
ax.set_title("Relative Risk", size = 20)
ax.set_xlabel("x", size = 14, color = "r")
ax.set_ylabel("y", size = 14, color = "r")
ax.set_zlabel("relative risk", size = 14, color= "r")
ax.set_zlim3d(0,4)
#x = np.array([i for i in range(10,1000,10)])
#y = np.array([i for i in range(10,1000,10)])
x = np.random.randint(999,size = 1000)+1
y = np.random.randint(999,size = 1000)+1
#x = np.array([0]*10000)
#for i in range(len(x)):
#  x[i] = i%100
T = len(x)
z = np.zeros(T)
l = np.zeros(T)
u = np.zeros(T)
T = len(x)
for i in range(T):
  r = Risk(x[i],T-x[i],y[i],T-y[i])
  z[i] = r.relative_risk()
  lu = r.CI()
  l[i] = lu[0]
  u[i] = lu[1]

ax.scatter(x,y,z,s = 4 , c= "green")
ax.scatter(x,y,l,s = 2, c= "blue")
ax.scatter(x,y,u,s = 2, c= "red")
plt.show()

 

f:id:medical-science:20220202144050p:plain

  • 同じような事を、オッズ比でも出来る。
  • オッズは、事象の起こった数を起こらなかった数で割った数
  • それを暴露群と非暴露群で比を取ると、オッズ比
  • さらに、信頼区間を似たような式で計算出来る。

再び、お絵かき

import math
class OddsRisk:
  def __init__(self,a,b,c,d):
    self.a = a
    self.b = b
    self.c = c
    self.d = d

  def odd_exp(self):
    return self.a/(self.b)
  def odd_unexp(self):
    return self.c/(self.d)
  def relative_odd(self):
    return self.odd_exp()/self.odd_unexp()
  def CI(self):
    var = 1/self.a + 1/(self.c) + 1/self.b + 1/(self.d)
    lower = math.exp(-1.96 * var + math.log(self.relative_odd()))
    upper = math.exp( 1.96 * var + math.log(self.relative_odd()))
    return [lower, upper]

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(111,projection = "3d")
ax.set_title("Relative Odds", size = 20)
ax.set_xlabel("x", size = 14, color = "r")
ax.set_ylabel("y", size = 14, color = "r")
ax.set_zlabel("relative odds", size = 14, color= "r")
ax.set_zlim3d(0,4)
#x = np.array([i for i in range(10,1000,10)])
#y = np.array([i for i in range(10,1000,10)])
x = np.random.randint(999,size = 1000)+1
y = np.random.randint(999,size = 1000)+1
#x = np.array([0]*10000)
#for i in range(len(x)):
#  x[i] = i%100
T = len(x)
z = np.zeros(T)
l = np.zeros(T)
u = np.zeros(T)
T = len(x)
for i in range(T):
  r = OddsRisk(x[i],T-x[i],y[i],T-y[i])
  z[i] = r.relative_odd()
  lu = r.CI()
  l[i] = lu[0]
  u[i] = lu[1]

ax.scatter(x,y,z,s = 4 , c= "green")
ax.scatter(x,y,l,s = 2, c= "blue")
ax.scatter(x,y,u,s = 2, c= "red")
plt.show()

 

f:id:medical-science:20220202144908p:plain

  • 絵を見比べる
  • リスクの方は、1000,1000付近で1に近づいている
  • しかし、オッズは、0っぽく近づいているように見える
    • オッズは、事象が起きた、起きてないを対等に見ている特徴量だが、
    • リスクは、そこが非対称に見ている
      • 式の分母が各群の総和で、分子が各群の起きた方だけ
  • なので、挙動が違ってしまうのだろう。

 

バイバイ!