血圧の回帰分析 -...

43
血圧の回帰分析 ―Rでやってみた前田 淳(まえだ じゅん) 北九州市立大学

Upload: others

Post on 01-Feb-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • 血圧の回帰分析―Rでやってみた―

    前田 淳(まえだ じゅん)

    北九州市立大学

  • 統計学もRも素人・初心者なので、おかしなところはご容赦を!

    2

  • なぜRにしたのか

    これまで使ってきた計量分析ソフトが、高い!

    10万円弱する。

    また、パソコン買い替えたときに、業者に手続きして、古いパソコンから新しいパソコンに移し替える作業が面倒。

    ソフトがバージョンアップされていると、どうしても新しいのに買い替えたくなる。

    ⇒これが続くと、かなわんな~。

    3

  • なぜRにしたのか フリーのオープンソフトが最近あるらしい。

    いろいろ聞いてみると、グレーテルとRというのが評判いい。

    グレーテルは、マウス操作で簡単に回帰分析などできてしまうらく、使っている人が絶賛。

    Rも有名。グレーテルよりは、慣れるまでが少しややこしいかも。コマンドを入力する方式だからでせう。でもコマンド入力って一般的なことでは?

    ⇒いろいろ比較した結果、Rに決定。理由は、解説書がたくさんあること。グレーテルはなぜか解説書が売られていない。(これから増えるのかいな。) 4

  • Rのインストール解説書を見て、まずはインストール。

    http://www.r-project.org/が本家らしい。

    ただし、日本のいくつかの大学などにミラーサイトがあるそうな。※URLは変更される可能性があるので、各自で確認のうえ利用してくださ

    い。

    ⇒インストールしてみたら、とても簡単に済んだ。パソコンが64ビット版の場合は、64ビット仕様と32ビット仕様の両方がインストールできた。

    5

  • 起動とデータのインストール

    デスクトップにRのアイコンがでているので、それをダブルクリック。

    起動したらまずやるのが、作業ディレクトリの確認と変更。

    コマンドを入力する「>」の記号の後に、「getwd()」と入力する(get working directoryの略か?)。※以下、「>」は省略する。

    すると、たいてい C ドライブのどこかになっている。

    USBにR_space(もちろん、任意の名前)というフォルダを作って、そこで今後は作業したいので、メニューバーの「ファイル」のディレクトリ変更で、USBのR_spaceに変更。

    6

  • 起動とデータのインストール

    データは、まずエクセルで作っておいたものをCSVファイルにして、USBのR_spaceに保存。

    データの読み込みは、「bld_prssur

  • 起動とデータのインストール

    「read.csv」が「CSVファイルを読み込みなさい、というコマンド(コマンドのことをスクリプトというらしい)。

    ファイル名は、” “で囲う。

    「header=T」は、そのCSVファイルの最初の一行は、データではなくて、タイトル行ですよ、という指示。

    8

  • 元のデータ

    今回やろうとしているのは、血圧をどうしたら高くならずに生活できるか、知りたいということ。

    自分の血圧を2016年の11月29日からほぼ毎日、計測。被説明変数(従属変数)としてのデータは、下のような感じ。

    9

    左腕・上 左腕・下 左腕・脈 右腕・上 右腕・下 右腕・脈

    134 84 50 148 103 82131 93 87 131 88 83120 89 99 128 84 93123 88 79 128 82 74103 68 83 110 71 88118 76 98 121 78 99131 82 75 141 95 68123 88 73 124 71 53129 82 73 129 86 81123 90 71 143 86 75101 65 65 112 82 77134 96 61 129 96 78

  • 元のデータ

    血圧の上の値と下の値をそれぞれ左右の腕で計測し、さらに、脈拍数も記録。

    左右の腕で、血圧の値ってちがうもんですね。

    回帰分析の際は、上の値も下の値も、左右それぞれの平均値を利用。

    説明変数(独立変数)は、次のようなデータを計測。

    10

  • 元のデータ

    歩いた歩数―帰宅時に何歩あるいたかを歩数計で観測。血圧の測定は、だいたい夜になった。

    運動時間―ジムで軽く運動した時間。1時間単位。

    ポテチ、うどん、味噌汁―塩分の多い食品という意味。こうしたものを食べた日は、1、そうでないときは0、のダミー変数。

    11

    歩いた歩数

    (帰宅時)

    運動時間(ジム、ヨ

    ガ)

    ポテチ、うどん、味噌汁

    (1, 0)

    天気(雨天・曇

    天=1)

    入浴後(1, 0)

    正座中(1,0)

    正座後(1,0)

    飲酒量(合)

    2539 0 1 NA 0 0 0 03850 0 1 NA 0 0 0 13850 0 1 NA 0 0 0 1.53850 0 0 NA 0 0 0 37700 1 1 NA 1 0 0 22539 0 0 1 1 0 0 22539 0 0 0 1 0 0 32539 0 0 0 1 0 0 2

  • 元のデータ

    天気―雨の日や雨天が1、晴れの日が0、のダミー変数。天気が悪い日は低気圧が来ているわけだから、人間の体も血圧が下がったり、逆に上がったりするのかしらん、という考えで入れてみた。

    入浴後―入浴中は血圧が下がるらしいけど、入浴後は寒いところに出るから、血圧上がるらしい。といっても、入浴後に部屋を暖かくして血圧測っているので、関係ないかも、と思いつつ記録。入浴後なら1、そうでなければ0、のダミー変数。

    12

  • 元のデータ

    正座中・正座後―座椅子に座って血圧測る時に、ついつい、正座していることがある。正座すると足の血液が上半身に押し上げられるから、血圧上がるのでは、と思い、計測。逆に正座後は血圧さがるのかも。

    飲酒量―晩酌することあるので、それが血圧にどう影響するのか、心配。日本酒の量に換算して記録。

    ほぼ毎日計測しているデータなので、元々は時系列のデータ。しかし、内容的には時系列かどうか疑問なので、時の要素は入れずにやってみた。

    ただし、ポテチ、味噌汁、うどんなど塩分の多い食事をした影響は翌日に出るかもと思い、lagデータにしたものも試しにやっている。 13

  • いよいよRで回帰分析

    こうしたエクセルファイルをCSVファイルとして保存する。

    ただし、データ名が日本語ではうまくいかないかも、と思い、CSVファイルはファイル名も含めて、英語主体。

    ファイル名は、「170115_bld_prssur.csv」。

    データ名は次のように命名。「up_bld_prssur」「low_bld_prssur」「walk」「sports」「salt」「rainy」「bath」「seiza」「alc」。今まで説明したので、わかりますね。

    ※「正座後」はデータがあまりないので、削除した。

    ※また、データの前に「ln_」とついているのは自然対数。血圧のデータや歩いた距離は、数百、数千という桁が大きいデータなので、対数化して標準化した。

    14

  • いよいよRで回帰分析

    ※「正座後」はデータがあまりないので、削除した。

    ※また、データの前に「ln_」とついているのは自然対数。血圧のデータや歩いた距離は、数百、数千という桁が大きいデータなので、対数化して標準化したデータも作成。

    ※すでに説明したように、「lag_salt」が後から出てくるのは、塩分の多い食事をした影響が次の日に血圧を高めるかも、と思ったので、「salt」のデータをそのまま、一日分だけ下にずらしたデータも作ったということ。

    ※「up_avg」と「low_avg」は、血圧の上の値の左右平均値、下の値の左右平均値。

    15

  • CSVのファイルはこんな感じ。

    16

    up_avg ln_up_avg low_avg ln_low_avg walk ln_walk sports salt lag_salt rainy bath seiza alc141 4.95 93.5 4.54 2539 7.84 0 1 NA NA 0 0 0131 4.88 90.5 4.51 3850 8.26 0 1 1 NA 0 0 1124 4.82 86.5 4.46 3850 8.26 0 1 1 NA 0 0 1.5

    125.5 4.83 85 4.44 3850 8.26 0 0 1 NA 0 0 3106.5 4.67 69.5 4.24 7700 8.95 1 1 0 NA 1 0 2119.5 4.78 77 4.34 2539 7.84 0 0 1 1 1 0 2136 4.91 88.5 4.48 2539 7.84 0 0 0 0 1 0 3

    123.5 4.82 79.5 4.38 2539 7.84 0 0 0 0 1 0 2129 4.86 84 4.43 3850 8.26 0 1 0 0 1 0 1.5133 4.89 88 4.48 2539 7.84 0 0 1 0 1 0 2

    106.5 4.67 73.5 4.3 0 0 1 0 0 0 1 0 2131.5 4.88 96 4.56 3850 8.26 0 1 0 0 0 0 0.5131 4.88 86 4.45 2539 7.84 0 0 1 1 1 0 1

    113.5 4.73 79.5 4.38 2539 7.84 0 0 0 1 1 0 3121.5 4.8 80 4.38 0 0 1 1 0 0 1 0 2147 4.99 99 4.6 3850 8.26 0 1 1 0 1 0 2

    134.5 4.9 86 4.45 0 0 0 0 1 0 1 0 1.5129 4.86 85 4.44 0 0 2 1 0 0 1 0 1

  • いよいよRで回帰分析

    解説書は買っていたものの、細かいところでわからずに作業が止まることもある。

    そんなときは、グーグルで検索すると、使い方の解説がいろいろと出てくる。これもRの便利なところかも。

    回帰分析は、次のようにコマンドを入力するらしい。

    「up_bld_prssur.lm

  • いよいよRで回帰分析

    「up_bld_prssur.lm

  • 分析結果

    「summary (名前)」の後にエンターキーを押すと、あっという間に結果が出た。その中から、t値が低く、係数=0という帰無仮説が否定できていない(つまり、p値が高い)データを一つずつ除いて、回帰分析を繰り返す。

    つまり、最初の「up_bld_prssur.lm

  • 分析結果

    削除した独立変数は、rainy、bath、alc。

    つまり、雨天で低気圧が来ていても、入浴後でも、晩酌していても、このデータでの回帰分析については、血圧にはほとんど(まったく)関係ないってこと。

    ちなみに、塩分が高い食事を採ったことが、次の日に血圧を上げるかもと思って、「lag_salt」(つまり、saltのデータを一日下にずらしたもの)をやってみたが、説明力はなかった。しかし、「salt」自体は相関が高かった。

    ⇒結果は、こうなった(並びが不揃いだけど)。

    20

  • 分析結果

    Coefficients:Estimate Std. Error t value Pr(>|t|)

    (Intercept) 225.070 46.357 4.855 9.6e-05 ***ln_walk -12.929 5.875 -2.201 0.039674 * sports -16.354 4.211 -3.883 0.000924 ***salt 15.571 4.409 3.531 0.002097 ** seiza 35.225 8.234 4.278 0.000367 ***---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

    ※ 「9.6e-05」は、「9.6×10のマイナス5乗」という意味。

    21

  • 分析結果

    上の血圧=

    -12.929×ln歩数

    -16.354×スポーツ時間

    +15.571×塩分

    +35.225×正座

    + 225.070(定数項)

    +誤差項22

  • 分析結果

    定数項が高めなのが気になる。

    世間で言われているとおり、軽いスポーツをすると血圧が下がる。1時間で16.4下がる。

    塩分の多い食事は血圧を15.57上げる。

    正座は、血圧をなんと35.23上げる。

    血圧 23

  • 分析結果 従属変数とln歩数と歩数の関係はエクセルによると下のとおり。1000歩あるいたからといって、血圧が89も下がるはずはない。つまり、-12.929×ln1000=-89.31は、極端です。

    これは、あくまで線形でグラフを伸ばしたらの話。

    データ数がまだ少ないからか(46データ)。

    とりあえず、歩くのはいいことだ、ということはわかった。

    血圧

    24

    血圧の変化 ln歩数 歩数

    89.31 6.91 1000

    98.27 7.60 2000

    103.51 8.01 3000

    107.23 8.29 4000

  • 分析結果

    t値は、各独立変数の係数を標準誤差で割った数値。

    この絶対値が2以上であれば、ほぼOKというのが通例。

    p値はすでの説明したとおり、各独立変数の係数が、計算上はなにがしかの結果を出していても、実は、ゼロ、つまり無相関である確率。

    つまり、t値とp値は内容的に同じもの。

    P値が低いほど、係数=0なる帰無仮説を棄却することができて、独立変数が有意。

    いずれも5%未満で有意、つまり、相関がありそうってこと。

    25

  • 分析結果(つづき)

    Residual standard error: 7.655 on 20 degrees of freedom

    (21 observations deleted due to missingness)

    Multiple R-squared: 0.6935, Adjusted R-squared: 0.6322

    F-statistic: 11.31 on 4 and 20 DF, p-value: 5.812e-05

    ※自由度が21なのは、NAなデータが多々あるため。この問題については、最後の「補遺」で言及する。

    26

  • 分析結果

    「Adjusted R-squared: 0.6322」が自由度修正済みの決定係数。つまり、この回帰結果の式で、データの63.2%が説明できている、ということ。

    しかし、walkの結果が極端な数値となっていて、分析が成功と言えるかどうかは微妙。

    血圧27

  • 分析結果

    下の血圧についても、同様にやってみた。その結果は、下のとおり。

    Coefficients:

    Estimate Std. Error t value Pr(>|t|)

    (Intercept) 157.227 32.973 4.768 0.000117 ***

    ln_walk -9.445 4.179 -2.260 0.035130 *

    sports -10.643 2.996 -3.553 0.001995 **

    salt 12.500 3.136 3.985 0.000728 ***

    seiza 17.286 5.857 2.951 0.007892 **

    ---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

    28

  • 分析結果

    下の血圧=

    -9.445×ln歩数

    -10.643×スポーツ時間

    +12.500×塩分

    +17.286×正座

    +157.227 (定数項)

    +誤差項29

  • 分析結果

    定数項がやはり高め。

    上の血圧と、内容的には同じ。

    「Adjusted R-squared」は、 0.5798。血圧

    30

  • 検 定

    t値は、各独立変数の係数を誤差(残差)の標準偏差で割ったもの。

    回帰分析では、いくつかの検定がつきもの。

    構造変化についてのチョウのテストや誤差項についての均一分散の検定など。

    後者、をやってみる。

    31

  • 検 定

    Rで様々な検定やより高度な操作をしたいときは、Rのサイトから別途、パッケージをダウンロードしておかないといけないらしい。

    Rのサイト「cran」にアクセスして、左側のメニュー欄の「package」⇒「名前別の一覧」をクリック(全部英語です)。

    均一分散の検定は、bptestやwhitetest という名前なので、そうしたパッケージ゛があるかと思いきや、全然ない! よく調べると、「lmtest」(回帰分析の各種テスト、といった意味だろう)というパッケージをダウンロードして、その中にいろいろ入っているらしい。

    32

  • 検 定

    「lmtest」というパッケージをクリックすると、説明とインストール画面が出た。

    とりあえず、マニュアルがあったので、それをUSBのフォルダ「R_space」に保存。

    次に、パッケージをダウンロードしたいけど、どこにあるのかわからない! 「Package source」に「lmtest_0.9-34.tar.gz」というのがあったので、これをダウンロードしてみたけど、開けない!

    33

  • 検 定

    ネットでいろいろ調べてみると、まずRをクリックして起動させて、メニューバーの中に「Packages」(日本語版は、日本語表記になっている)というのがあるので、それでインストールできるらしい。やれやれ。最初からやり直し。

    さっそくやってみる。「Packages」→「Install package(s)」とクリックすると、ミラーサイト一覧が出る。つまり、cran本家ではなく、最寄りの協力サイトにアクセスする方式らしい。

    その方がインストールが速いらしい。

    「Japan」を選ぶと、次に、Packageの一覧が出る。

    34

  • 検 定

    「lmtest」をクリックすると、「個人のライブラリーを使うか?」という意味のフォーム(英語版でやったので、日本語では少し違うかも)が出る。よくわからないので、「No」を選ぶと、インストールが失敗というメッセージが出た。

    そこで、「Yes」を選ぶと、「個人のライブラリーを作るか?」といった質問が帰ってくる。これも「No」を選ぶとうまくいかなったので、「Yes」を選ぶと、なんとかインストールできた。

    しかし、結果をみると、USBのフォルダ「R_space」ではなく、C:¥Users¥maeda¥AppData¥Local¥Temp¥RtmpUj1A9v¥downloaded_packagesにインストールされたらしい。

    35

  • 検 定

    「lmtest」を使うためには、「zoo」などの他のプログラムがいくつか必要らしい。これらは、「lmtest」インストールの際に、自動的にインストールされた。

    Rの画面で「Library(lmtest)」と入力してみると、うまくいったらしい返事が戻ってくる。

    次に「search()」と入力してみると、たしかに「lmtest」と「zoo」など関連プログラムがあるらしいことがわかった。

    Rのメニューの「Packages」の中に「Load package(s)」というのがあるので、それをクリックすると、インストールされたものの一覧が出る。その中から「lmtest」をクリックすると、うまく行ったらしい画面が出る。これで、使えますよってことらしい。 36

  • 検 定

    そこで、均一分散かどうかの検定をしてみる。ネットで見てみると、Breush Pagan testというのが載っていた(野田顕彦氏ホームページ、http://at-noda.com/econwiki/index.php?EconWiki、アクセス日:2017/01/24)

    lmtestのパッケージをロードしてから、下の血圧についての回帰分析の後に、「bptest(low_bld_prssur.lm)」と入力。すると下の結果が返ってきた。

    「studentized Breusch-Pagan test

    data: low_bld_prssur.lm

    BP = 2.8321, df = 4, p-value = 0.5863」

    37

  • 検 定

    「studentized」はスチューデントのT(ウィリアム・ゴセットのペンネームから来ているらしい)つまり、T分布する Breusch-Pagan testをしましたってことだろうか。

    大事なのは、「p-value = 0.5863」。均一分散である確率(帰無仮説)が58.6%ということで、帰無仮説は棄却されず、かなり(ある程度)均一分散ってことでいいようだ。

    38

  • 補 遺

    データの対数を取るときに、ゼロやNAがある場合は要注意。

    Log0は計算できない!

    そういう場合は、エクセルで前もってif関数などを使い、ゼロやNAデータはそのままゼロやNAになるようにして、それ以外は対数化する必要がある。たとえば、

    =IF(セル参照=0,0,IF(D8=“NA”,“NA”,LN(セル参照)))

    39

  • 補 遺

    コマンド(スクリプト)は、Rを終了すると消えてしまうようだ。

    次に「ここを少し変えてみたらどうなるだろう」といって、同じような操作を繰り返す時に、一から入力するのは面倒。

    テキストファイル形式で終了時に保存されるが、コマンド部分をコピペするのが、なかなか大変。

    40

  • 補 遺

    ⇒Rにはエディター機能があって、とても便利。「ファイル」→「新しいスクリプト」でエディター画面が開く。それをR本体の画面と上下や左右に並べて、スクリプトはエディター画面で入力し、一行ずつ、「Ctrl」+「R」キーを押せば、R本体の画面でコマンドを実行してくれる。スクリプトはそのまま保存できて、次にまた「Ctrl」+「R」キーで同じ操作ができるのだ。

    41

  • 補 遺歩数のデータでは、車で帰宅したり、近くのバス停までバスに乗った場合は、ゼロではなくNAで入力している。

    このことが、妥当なのかどうかは、今後、要検討。

    NAにした理由は、ゼロ歩や数百歩などの歩数では、血圧にほとんど影響がないのでは、という実感による。それをゼロのデータにすると、かなり歩いて3000歩といった場合と一緒に計算されてしまい、結果が歪みはしないか、ということ。

    つまり、横軸に歩数、縦軸に血圧を取ったとすると、2000歩ぐらいまでは、歩数と血圧の関係は独立で、その後、4000歩ぐらいまでは右下がりで、その後はまた、独立(たくさん歩いたからといって、それに比例して血圧が下がり続ける筈はない)なのでは、ってこと。

    42

  • 補 遺実際、車やバスでの帰宅をNAにするか、ゼロで入力するかでは、回帰分析の結果が大きく異なった。

    NAでやった方が、歩数も含めてパラメータ全体の有意性が良好だった。血圧と歩数のみの相関係数は非常に低くて、今のところ、ほぼゼロ。本当は影響ない可能性も。

    車やバスでの帰宅の際には、歩数をそもそも計測していないからといって、NAにするのは妥当なのか。それとも、恣意的な操作に堕しているとして、ゼロにすべきなのか、大きな問題のような。

    NAにすると、自由度(degree of freedom)が小さくなる。そのことが回帰分析の結果に影響しているのかも。

    今後の課題です。とにかく、もっとデータが集まることが必要。

    43