二次関数に直線を引くとどうなる?
データベース(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")
次、
二次関数の関係に直線を書いた
二次関数の関係に線形回帰モデルをすると、二次関数の関係に関しても直線を引くというちょっと意味のわからない事になる。
それをあえてやってみる
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)")))
かなり明らかな有意差をもって訳の分からない線を引いているが、これをみて年齢が1上昇するたびに血圧が3 mmHg上昇すると解釈する人は何人いるだろうか? (cf.ちなみに有効桁数意識して書くと、p値は0.0000000699である)
こういう事は論文で結構行われてしまっている(特に多変量解析にするとわかりにくくなるので、本当によくある。メタアナリシスでもある)。例えば、妊娠期間と出生児生命予後の関係などを見る時に、妊娠期間を連続変数で入れるとこういう解析を行っているという事。つまり妊娠期間が長ければ長いほど、40週を超えて41週、42週となればなるほど、できればもっと長い方が予後はよくなるという仮定をしているという事になる。
じゃあどうすれば良いかというと、妊娠期間のように、短すぎても長すぎても予後が悪くなるだろうな、と思われる時には例えば3群に分ける(早産・正期産・過期産など)方が解釈上も仮定上もうまくfitする印象がある。
他にこういった例がどのような分野にあるだろうか。