前回の記事では階乗の自然対数を求めるユーザー定義関数をSQL Serverで作成するを記述した.今回はそのユーザー定義関数を用いてFisherの直接確率を求めるストアドプロシージャを記述する.
四分表を作成するストアドプロシージャ
熱中症の搬送人員と最高気温との相関関係を可視化し閾値をχ二乗検定するでは四分表を作成するストアドプロシージャを作成した.今回はそこに列を一つ追加する.
Fisherの直接確率
P = (a+b)!(c+d)!(a+c)!(b+d)!/a!b!c!d!N! が定義である.例によって,Exp(LN(P)) = P は自明である.これをコードとして実装する.
ストアドプロシージャの定義
下記コードをクエリウィンドウで実行する.ユーザー定義関数(ここでは LOG_FACT)の前にdbo.を書き加えておかないと,「組み込み関数名として認識されません」というエラーが出る.
ALTER PROCEDURE [dbo].[Temperature_Death] @Temperature int AS BEGIN SELECT @Temperature AS '閾値' , SUM(CASE WHEN E.[傷病程度:死亡] > 0 AND T.日最高気温 >= @Temperature THEN 1 ELSE 0 END) AS a , SUM(CASE WHEN E.[傷病程度:死亡] = 0 AND T.日最高気温 >= @Temperature THEN 1 ELSE 0 END) AS b , SUM(CASE WHEN E.[傷病程度:死亡] > 0 AND T.日最高気温 < @Temperature THEN 1 ELSE 0 END) AS c , SUM(CASE WHEN E.[傷病程度:死亡] = 0 AND T.日最高気温 < @Temperature THEN 1 ELSE 0 END) AS d , SUM(CASE WHEN E.[傷病程度:死亡] > 0 THEN 1 ELSE 0 END) AS 'a+c' , SUM(CASE WHEN E.[傷病程度:死亡] = 0 THEN 1 ELSE 0 END) AS 'b+d' , SUM(CASE WHEN T.日最高気温 >= @Temperature THEN 1 ELSE 0 END) AS 'a+b' , SUM(CASE WHEN T.日最高気温 < @Temperature THEN 1 ELSE 0 END) AS 'c+d' , COUNT(*) AS N , Exp(dbo.LOG_FACT(SUM(CASE WHEN E.[傷病程度:死亡] > 0 THEN 1 ELSE 0 END)) + dbo.LOG_FACT(SUM(CASE WHEN E.[傷病程度:死亡] = 0 THEN 1 ELSE 0 END)) + dbo.LOG_FACT(SUM(CASE WHEN T.日最高気温 >= @Temperature THEN 1 ELSE 0 END)) + dbo.LOG_FACT(SUM(CASE WHEN T.日最高気温 < @Temperature THEN 1 ELSE 0 END)) - dbo.LOG_FACT(SUM(CASE WHEN E.[傷病程度:死亡] > 0 AND T.日最高気温 >= @Temperature THEN 1 ELSE 0 END)) - dbo.LOG_FACT(SUM(CASE WHEN E.[傷病程度:死亡] = 0 AND T.日最高気温 >= @Temperature THEN 1 ELSE 0 END)) - dbo.LOG_FACT(SUM(CASE WHEN E.[傷病程度:死亡] > 0 AND T.日最高気温 < @Temperature THEN 1 ELSE 0 END)) - dbo.LOG_FACT(SUM(CASE WHEN E.[傷病程度:死亡] = 0 AND T.日最高気温 < @Temperature THEN 1 ELSE 0 END)) - dbo.LOG_FACT(COUNT(*))) AS 'Fisher' FROM dbo.T_HeatStroke AS E INNER JOIN dbo.T_MaxTemperature AS T ON E.日付 = T.年月日 AND E.都道府県コード = T.都道府県コード END