医療データ奮闘記

公衆衛生大学院に入った内科系専門医が医師として培った現場感と大学院で培った統計の知識を交えながら、医療や疫学や統計に関する素朴な疑問や本音をつらつら書いています。

二次関数に直線を引くとどうなる?

データベース(DB)作成

まずは年齢だけで説明できる血圧が入ったDB(random errorなし)を作成

num <- 40
age <- sample(65:85, num, replace=TRUE)
XX <- data.frame(age)
XX$sbp <- 130 + (XX$age-65)*1.2
XX$sbp2 <- 100 + (XX$age-72)^2*0.5
head(XX)
##   age   sbp  sbp2
## 1  80 148.0 132.0
## 2  83 151.6 160.5
## 3  80 148.0 132.0
## 4  83 151.6 160.5
## 5  74 140.8 102.0
## 6  68 133.6 108.0

サンプル数は気軽に集めれる40程度にしておく

直線の関係に直線を書いた

res1 <- lm(sbp ~ age, data = XX)
summary(res1)
## Call:
## lm(formula = sbp ~ age, data = XX)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -1.442e-14 -5.835e-15 -4.310e-16  5.494e-15  1.349e-14 
## 
## Coefficients:
##              Estimate Std. Error   t value Pr(>|t|)    
## (Intercept) 5.200e+01  1.611e-14 3.229e+15   <2e-16 ***
## age         1.200e+00  2.135e-16 5.620e+15   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.985e-15 on 38 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 3.159e+31 on 1 and 38 DF,  p-value: < 2.2e-16

まあそりゃ有意になる。

しかもデータベース作成の際の設定通り、ちゃんと年齢が1上がる度に血圧が1.2 mmHg上昇するというデータを作成した時の通りの結果になっている。

散布図に直線を引くと、

plot(XX$age,XX$sbp)
abline(res1,col="red")

f:id:yiliaojingji:20190703132648p:plain
二次関数直線1

次、

二次関数の関係に直線を書いた

二次関数の関係に線形回帰モデルをすると、二次関数の関係に関しても直線を引くというちょっと意味のわからない事になる。

それをあえてやってみる

res2 <- lm(sbp2 ~ age, data = XX)
summary(res2)
## 
## Call:
## lm(formula = sbp2 ~ age, data = XX)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -17.491 -15.402  -5.213  14.154  32.952 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -106.3341    34.4494  -3.087  0.00377 ** 
## age            3.0443     0.4567   6.666 6.99e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 17.08 on 38 degrees of freedom
## Multiple R-squared:  0.539,  Adjusted R-squared:  0.5269 
## F-statistic: 44.44 on 1 and 38 DF,  p-value: 6.986e-08

この結果は、モデルの仮定などを全く気にしない場合、年齢が1上昇するたびに血圧が3 mmHg上昇する(かなり明らかな有意差を以て上昇する)と解釈されうる。

40人しかサンプル数が無いのにここまでの有意差が出るのは大したものである。

散布図に直線を引く。

plot(XX$age,XX$sbp2)
abline(res2,col="red")
legend("topleft",legend=paste("coef:",round(coef(res2)[2],3)))
legend("top",legend=paste(paste("p value:",round(summary(res2)$coefficients[ 2,"Pr(>|t|)"],5),"(signif digits=5)")))

f:id:yiliaojingji:20190703132846p:plain
二次関数直線2
かなり明らかな有意差をもって訳の分からない線を引いているが、これをみて年齢が1上昇するたびに血圧が3 mmHg上昇すると解釈する人は何人いるだろうか? (cf.ちなみに有効桁数意識して書くと、p値は0.0000000699である)

こういう事は論文で結構行われてしまっている(特に多変量解析にするとわかりにくくなるので、本当によくある。メタアナリシスでもある)。例えば、妊娠期間と出生児生命予後の関係などを見る時に、妊娠期間を連続変数で入れるとこういう解析を行っているという事。つまり妊娠期間が長ければ長いほど、40週を超えて41週、42週となればなるほど、できればもっと長い方が予後はよくなるという仮定をしているという事になる。

じゃあどうすれば良いかというと、妊娠期間のように、短すぎても長すぎても予後が悪くなるだろうな、と思われる時には例えば3群に分ける(早産・正期産・過期産など)方が解釈上も仮定上もうまくfitする印象がある。

他にこういった例がどのような分野にあるだろうか。