暑熱馴化を考慮して熱中症搬送人員数を予測するモデルを構築する

 人体には暑熱馴化という機構がある.暑さに体が慣れることである.この機構を取り込んだモデルを構築してみた.

暑熱馴化とは

 暑さに体を徐々に慣らしていくことを言う.暑熱順化とも書く.暑熱馴化が充分でないとより低温でも熱中症が起きやすいとされる.夏の気候が進むに連れて暑熱馴化した個体が増えていくと予想される.

暑熱馴化をモデルに取り込むには

 おそらく時間経過の変数を取り込むのが良いだろうと検討をつけた.具体的には月である.『気象データから熱中症救急搬送者数を予測する』という日本救急医学会の原著論文では7月と8月で暑熱馴化を分けていたため,年月日を7月末日までと8月1日以降で分けるモデルを構築してみた.一方,夏の気候が進むにつれて暑熱馴化した個体が増えると予想されることから,月をそのまま変数として投入するモデルも必要と考えられた.

クエリ

 下記クエリをSQL Serverで発行して結果をEXCELにコピペしHeatStroke4.xlsxという名前で保存する.

USE HeatStrokeDB;
GO
SELECT	P.FiscalYear
,	T.年月日	AS Date
,	MONTH(T.年月日)	AS Month
,	CASE WHEN MONTH(T.年月日)<= 7 THEN 1 ELSE 0 END	AS Acclimation
,	T.都道府県コード	AS PrefCode
,	T.都道府県	AS Pref
,	T.日最高気温	AS Temp
,	V.日平均蒸気圧	AS Vapor
,	W.平均風速	AS Wind
,	C.平均雲量	AS Cloud
,	P.Population	AS Pop
,	H.[搬送人員(計)]	AS Num
FROM	dbo.T_HeatStroke	AS H
INNER	JOIN	dbo.T_MaxTemperature	AS T
ON	H.都道府県コード = T.都道府県コード
AND	H.日付 = T.年月日
INNER	JOIN	dbo.T_VaporPressure	AS V
ON	H.都道府県コード = V.都道府県コード
AND	H.日付 = V.年月日
INNER	JOIN	dbo.T_Wind	AS W
ON	H.都道府県コード = W.都道府県コード
AND	H.日付 = W.年月日
INNER	JOIN	dbo.T_Population AS P
ON	H.都道府県コード = P.PrefCode
AND	YEAR(H.日付) = P.FiscalYear
INNER	JOIN	dbo.T_Cloud	AS C
ON	H.都道府県コード = C.都道府県コード
AND	H.日付 = C.年月日
ORDER	BY PrefCode, Date
(63725 行処理されました)

Rでの処理

 下記コードを実行する.

> y = HeatStroke4$Num
> x1 = HeatStroke4$Temp
> x2 = HeatStroke4$Vapor
> x5 = HeatStroke4$Acclimation
> x6 = HeatStroke4$Month
> p = HeatStroke4$Pop
> z1 = glm(y ~ x1 + x2, offset = log(p), family = poisson(link = "log"))
> z2 = glm(y ~ x1 + x2 + x5, offset = log(p), family = poisson(link = "log"))
> z3 = glm(y ~ x1 + x2 + x6, offset = log(p), family = poisson(link = "log"))

 結果は次のとおりである.7月と8月で分けた場合,7月以前の係数の符号は正であり,同じ最高気温,同じ平均水蒸気圧でも,8月以降よりも搬送人員数は多くなることが予想される.月を変数として投入した場合,係数の符号は負であり,月が進むほど同じ最高気温,平均水蒸気圧でも搬送人員数が少なくなると予想される.

 また7月と8月で分けるよりも,月を変数としてそのまま投入したほうがAICは良い.モデルの予測性能としては月をそのまま投入したほうが良さそうである.

> summary(z1)

Call:
glm(formula = y ~ x1 + x2, family = poisson(link = "log"), offset = log(p))

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-12.8521   -1.2624   -0.4054    0.9833   19.8305  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.288e+01  1.682e-02 -1360.2   <2e-16 ***
x1           2.735e-01  5.367e-04   509.6   <2e-16 ***
x2           6.379e-02  4.275e-04   149.2   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 857600  on 63724  degrees of freedom
Residual deviance: 264558  on 63722  degrees of freedom
AIC: 428808

Number of Fisher Scoring iterations: 5

> summary(z2)

Call:
glm(formula = y ~ x1 + x2 + x5, family = poisson(link = "log"), 
    offset = log(p))

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-12.2137   -1.1973   -0.3776    0.9475   21.2504  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.352e+01  1.741e-02 -1350.8   <2e-16 ***
x1           2.823e-01  5.402e-04   522.6   <2e-16 ***
x2           6.884e-02  4.273e-04   161.1   <2e-16 ***
x5           4.482e-01  2.883e-03   155.5   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 857600  on 63724  degrees of freedom
Residual deviance: 240471  on 63721  degrees of freedom
AIC: 404723

Number of Fisher Scoring iterations: 5

> summary(z3)

Call:
glm(formula = y ~ x1 + x2 + x6, family = poisson(link = "log"), 
    offset = log(p))

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-11.9928   -1.1828   -0.3778    0.9220   20.9818  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.136e+01  1.820e-02 -1173.8   <2e-16 ***
x1           2.843e-01  5.423e-04   524.3   <2e-16 ***
x2           7.738e-02  4.274e-04   181.1   <2e-16 ***
x6          -2.985e-01  1.776e-03  -168.1   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 857600  on 63724  degrees of freedom
Residual deviance: 235494  on 63721  degrees of freedom
AIC: 399746

Number of Fisher Scoring iterations: 5

ロジスティック関数の導入

 更に考察を進める.月をモデルに投入する際,1次の線形で投入したが,暑熱馴化した個体数は時間経過とともにシグモイド曲線を描くと考えられる.7月では暑熱馴化した個体数はまだ少なく,9月では馴化した個体数は十分に増加していると考えられ,8月はまさに馴化の最中であると考えられる.実際,8月上旬が最も暑い.そのような曲線を描くのに適した関数がロジスティック関数である.

 ここからは試行錯誤になる.

y=\frac{1}{1 + Exp(8-x)}

 上記のグラフを描いてみると6月から9月にかけての傾きは線形の場合とほぼ変わらない.

線形予測子がx-8の場合
線形予測子がx-8の場合

 そこで線形予測子の項に2をかけてみる.

y = \frac{1}{1 + Exp(16 - 2x)}
線形予測子が2(x-8)の場合
線形予測子が2(x-8)の場合

 このグラフだと7月は比較的少なく,8月に急峻に立ち上がり,9月には多く安定するという曲線が得られる.この関数を使用してみる.

> y = HeatStroke7$Num
> x1 = HeatStroke7$Temp
> x2 = HeatStroke7$Vapor
> x3 = HeatStroke7$Month
> x4 = exp(HeatStroke7$Month)
> x5 = 1/(1 + exp(8 - HeatStroke7$Month))
> x6 = 1/(1 + exp(16 - 2 * HeatStroke7$Month))
> p = HeatStroke7$Pop
> z3 = glm(y ~ x1 + x2 + x3, offset = log(p), family = poisson(link = "log"))
> z4 = glm(y ~ x1 + x2 + x4, offset = log(p), family = poisson(link = "log"))
> z5 = glm(y ~ x1 + x2 + x5, offset = log(p), family = poisson(link = "log"))
> z6 = glm(y ~ x1 + x2 + x6, offset = log(p), family = poisson(link = "log"))
> summary(z3)

Call:
glm(formula = y ~ x1 + x2 + x3, family = poisson(link = "log"), 
    offset = log(p))

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-12.1367   -1.2075   -0.3934    0.9025   20.9325  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.140e+01  1.694e-02 -1263.8   <2e-16 ***
x1           2.841e-01  5.083e-04   559.0   <2e-16 ***
x2           8.104e-02  3.997e-04   202.8   <2e-16 ***
x3          -3.026e-01  1.664e-03  -181.8   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 984714  on 70107  degrees of freedom
Residual deviance: 263517  on 70104  degrees of freedom
AIC: 446465

Number of Fisher Scoring iterations: 5

> summary(z4)

Call:
glm(formula = y ~ x1 + x2 + x4, family = poisson(link = "log"), 
    offset = log(p))

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-12.5525   -1.1976   -0.3893    0.9082   21.1380  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.255e+01  1.553e-02 -1452.0   <2e-16 ***
x1           2.706e-01  5.000e-04   541.2   <2e-16 ***
x2           6.747e-02  3.938e-04   171.3   <2e-16 ***
x4          -1.274e-04  7.212e-07  -176.6   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 984714  on 70107  degrees of freedom
Residual deviance: 261180  on 70104  degrees of freedom
AIC: 444128

Number of Fisher Scoring iterations: 5

> summary(z5)

Call:
glm(formula = y ~ x1 + x2 + x5, family = poisson(link = "log"), 
    offset = log(p))

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-12.0329   -1.2065   -0.3907    0.9017   20.8520  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.286e+01  1.554e-02 -1470.9   <2e-16 ***
x1           2.812e-01  5.052e-04   556.6   <2e-16 ***
x2           7.606e-02  3.965e-04   191.8   <2e-16 ***
x5          -1.485e+00  8.081e-03  -183.7   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 984714  on 70107  degrees of freedom
Residual deviance: 262084  on 70104  degrees of freedom
AIC: 445032

Number of Fisher Scoring iterations: 5

> summary(z6)

Call:
glm(formula = y ~ x1 + x2 + x6, family = poisson(link = "log"), 
    offset = log(p))

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-12.2273   -1.2029   -0.3876    0.9039   20.7392  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.286e+01  1.561e-02 -1464.9   <2e-16 ***
x1           2.777e-01  5.029e-04   552.2   <2e-16 ***
x2           7.139e-02  3.958e-04   180.4   <2e-16 ***
x6          -9.866e-01  5.305e-03  -186.0   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 984714  on 70107  degrees of freedom
Residual deviance: 260900  on 70104  degrees of freedom
AIC: 443848

Number of Fisher Scoring iterations: 5

 最後のモデルz6でAICが最も小さくなった.

まとめ

 暑熱順応を考慮したモデルを構築した.

 y = Exp(-22.86 + 0.2777 \times Temp + 0.07139 \times Vapor + Log(Population) -0.9866 \times \frac{1}{1 + Exp(16-2 \times Month)})

 暑熱馴化を表現するためにロジスティック関数を導入したが,本来ならば1年を周期とした三角関数を用いるべきであろう.

 余談だが,先に引用した論文では平均気温から予測式を導出し,その形が指数関数であることからポアソン分布を想定していると考えられる.しかし暑熱馴化の補正項を指数関数の外に出している.筆者は統計学初心者でありこのような補正が適切なのか,指数関数内の線形予測子で対応すべきなのかは判断できない.東京,大阪,神奈川の3都府県はよく一致しているが,他の道府県では一致の程度がどうなのか論文では紹介されておらず,気になる.論文著者に聞いてみたいところである.

コメントを残す

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

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