Fisherの直接確率を求めるストアドプロシージャをSQL Serverで定義する

 前回の記事では階乗の自然対数を求めるユーザー定義関数を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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください