【1-11】Rで医療統計で必要なtable1を作るtableoneパッケージについて紹介します医療統計でよく出てくるtable1について質問がありました。ありがとうございます!個人的には、table1の作り方が知りたいです。よろしければ、方法をご紹介お願いします。2019学会や論文でみる、ベースラインのtableについてお願いしたく思います。2019ということで今回は医療統計で使われるtable1を作る時に便利なtableoneパッケージについて紹介します。以下に今回使う仮のデータを作りました。set.seed(1)とかfloor()とかsampleとか訳のわからないものがいっぱい出てきますが、とりあえずRに全部コピーして1行ずつ実行するとdataという名前の表が完成します。data.frame(年齢,性別,体重,MMT,術側,治療)datatableoneの使い方0.tableoneパッケージを使えるようにする1.事前に理解しておくこと2.CreateTableOne関数でtable1の下地を作る3.print関数でExcelに貼り付けるための形式に直す4.Excelでインポート5.できるだけプログラムを書きたくない人向けの方法0.tableoneパッケージを使えるようにするまずはtableoneパッケージを使えるように準備をしてください。パッケージの導入方法については以下の記事で解説しています。Rで使うパッケージのインストールについて紹介します。独学で始める統計×データサイエンス1.事前に理解しておくことtable1はそもそも各群のベースラインを比較します。そのためには各変数(評価)がどんなデータか理解している必要があります。数値かカテゴリーか?集計を行うにはその変数が数値なのか?カテゴリー変数なのか?の理解が必要です。数値:年齢・体重カテゴリー:性別、MMT、術側MMTは「1が7人、2が5人・・・」と集計を行いたいとすると、値は数値ですがカテゴリー変数として集計を行う必要があります。数値の場合は正規分布なのか?そうでないのか?同じ数値でも正規分布かそうでないのか?を決めておくことが必要です。最大値〜最小値)で表現したりします。正規分布かどうかを確認するにはヒストグラムやQ-Qplotを作成したり、シャピロ-ウィルクの正規性の検定を使ったりします。カテゴリー変数の検定はカイ二乗検定なのかFisherの正確確率検定なのか?カテゴリー変数の場合カイ二乗検定かFisherの正確確率検定なのかを決めておくことが必要です。データ数が少なく各期待数が5未満だとFisherの正確確率検定を使うなどありますが、詳細は今後説明していくかもしれません。以上を踏まえた上でtableoneパッケージを使っていきます。2.CreateTableOne関数でtable1の下地を作るtable1の下地を作るにはCreateTableOne関数を使います。コード(1行で書く場合)コード(複数行に渡って書く場合。"治療")t1コードはスクリプトウィンドウを使うと数行にまたがって書くことができます。(スクリプトウィンドウについてはRコマンダーの基本的な画面の説明を行いますをご参照ください。)CreateTableOne関数には主に4つの要素があります。○○には今回使用する表の変数名が入ります。今回は「data」という名前の表を作ったのでdataになっていますが、別の名前を使った時はその名前になります。大文字と小文字は区別しますので注意。"○○"○○には表に乗せたい変数名を並べます。"変数名2")とc関数を使います。使って区切ってください。"○○"の中で「数値なんだけどカテゴリー変数」というものがあればfactorVarsに加えます。今回でいうとMMTの1〜5の値です。性別や術側のように数値でないカテゴリー変数は自動的にカテゴリー変数とみなしてくれるので、ここに入れるのはあくまでも「数値なんだけどカテゴリー変数」だけです。"○○"自体を消してしまってOKです。"○○"今回の治療のように分けたいグループがここに入ります。グループ間ごとの検定を行うこともできます。2グループならt検定とマンホイットニーのU検定、3グループ以上なら一元配置分散分析とクラスカル=ウォリス検定を行います。"○○"自体を消すとグループ分けせずに全体の要約が表示されます。コード結果3.print関数でExcelに貼り付けるための形式に直すこれでもある程度表になっているのですが、もう一つ作業が残っています。「正規分布かそうでないか?」「見た目をもう少し修正」といったところです。ここではprint関数を使います。今度はtable1という変数を使います。違う名前でも構いません。"体重")write.csv(table1,"table1.csv")print関数にもいくつかの要素があります。○○xには先程のcreateTableOne関数の結果を入れます。先ほどで言う「t1」です。違う名前にした方はその名前にしてください。"○○"改めてt1の性別や術側の項目を見てください。基本設定では2つのカテゴリーの場合、1つの要素しか出してくれません。全体数から引けばいいといえばいいのですが、女性の数も欲しいところです。"術側")を入れると以下のようになります。"○○"カテゴリー変数の検定は何も指定しないとカイ二乗検定を行います。なっているかどうかは一番右のtestを見ます。exactとなっています。"○○"同じ数字でも正規分布に従わないデータがある場合は中央値(四分位範囲)で示します。今回のデータで体重が正規分布でなかったとします。その場合はnonnormal="体重"とすることで平均(標準偏差)ではなく中央値(四分位範囲)に変えることができます。TRUEを付け加えます。"保存したい名前.csv")table1で表示したい表を作成したあとはcsv形式で保存します。csv形式で保存するにはwrite.csv関数を使います。○○はprint関数で使った変数名(ここではtable1)です。"の中はファイル名.csvとします。プロジェクトを作っているとfileビューでファイルを確認できます。プロジェクトを作っていなくて保存場所がわからない場合はgetwt()とコードを書き実行してください。getwt()()の中は何も入れなくて大丈夫です。4.Excelでインポートcsvファイルを作成したので、今度はExcelで読み込みます。読み込む時はインポートを使います。csvファイルを選択します。先程作成したファイルを選択します。macだと文字化けします。UFT-8を選択します。フィールドの区切りはカンマを選択します。ここは特に何もせず完了します。貼り付ける場所を選択します。慣れると早くなるのですが、どうしてもまだ慣れないということもあると思います。2つの方法を紹介します。1createTableOne関数の後、printを行わずデータを直接見ながらExcelに手打ちするprint関数を使わずにsumarry関数を使います。ここにグループ毎の結果が入っています。differences)<カテゴリーの場合>カテゴリー名(level)各変数の数(freq)各変数の%(percent)累積%(cum.percent)カイ二乗検定(pApprox)Fisherの正確確率検定(pExact)これらを見て直接Excelに打ち込んでもいいかもしれません。2EZRを使うEZRの「サンプルの背景データのサマリー表の出力」は実はtableone関数を使っています。今回の記事を見た上でこの画面を見て、どの項目がどの関数を使っているかイメージできるでしょうか。まとめ今回はRやプログラミングに慣れていない方でもイメージできるよう、tableone関数についてできるだけ細かく解説しました。学会や論文の作成のサポートになれば幸いです。次回は性別から男性だけを抜き出すなど条件に合うデータを抜き出す方法を紹介します。全ての記事一覧はこちらです。【1-7】Rで使うパッケージのインストールについて紹介します。Rを使っていく上でパッケージを利用する場面は多くあります。今回はパッケージのインストールの仕方について紹介します。インストールはRStudioで行う場合とコードを書く方法があります。パッケージについて統計ソフトRで何ができるか説明してみるでも説明しましたが、私はRは「Rは統計に強いスマホみたいなもの」と説明しています。スマホではアプリを追加して色々な機能が追加できるように、Rではパッケージを入れることで色々な機能が追加できます。今回はtable1の作成に強いtableoneパッケージをインストールしてみます。パッケージのインストールと呼び出しRStudioの場合RStudioでは画面右下のpackagesに既にインストールされているライブラリの一覧があります。(最初からいっぱい入ってる!)あまりにも数が多いですが、右上の虫眼鏡で検索することもできます。インストールされているだけでは使うことができません。チェックを入れることではじめて使えるようになります。一覧に使いたいパッケージ名がない場合は上のinstallでパッケージ名を入れるとインストールできます。その後チェックを入れると使うことができるようになります。ちなみにインストールは1回行えば基本2度目を行う必要はありません。RStudioを起動し直したりプロジェクトを変更するたびにチェックは外れるので付け直します。Rで直接コードを書く場合Rでコードを書く場合は以下のようになります。今回使うパッケージはtableoneです。library()RStudioで「チェックを入れる」に該当するのがlibrary関数です。()の中にはパッケージ名が入ります。"で囲む必要はありません。最初はRStudioでチェックを入れるだけでできてしまうので直接コードを書くことは少ないのですが、慣れてくると予測変換があるのでコードを打つほうが早くなります。install.packages()まだパッケージがインストールされていない場合はinstall.packages関数を使います。"の中にパッケージ名を入れます。TRUEはおまじないみたいなものと思っても大丈夫です。(このパッケージの依存関係にあるパッケージをインストールします)インストールは1回行えば基本2度目を行う必要はありません。あとは起動後やプロジェクトを変えるたびにlibraryで呼び出すだけです。パッケージの使い方それぞれのパッケージにはそれぞれの関数があります。ここではtable1を作成するCreateTableOne関数を呼び出すとします。パッケージの関数を使う時は直接関数名を打ち込んで問題ないのですが、あえて「このパッケージを使います!」とtableone::CreateTableOne(〜〜〜〜〜)と関数名を宣言することもできます。普通に個人で使う場合は上の前者の方法で十分だと思います。まとめ今回はパッケージの呼び出し方について解説しました。具体的なパッケージや関数は必要に応じて紹介していきます。次回はいよいよデータを扱っていくための基本操作を紹介します。変数について紹介します。全ての記事一覧はこちらです。【1-10】Rでよく使われる型について説明します。前回、医療統計でよく使われるdata.frameについて説明しました。独学で始める統計×データサイエンス記事でも紹介しましたが、data.frameはベクトルの集合体とも言えます。各列には「氏名(文字)、年齢(数値)、性別(男性/女性の2カテゴリー)」など色々な種類のデータが入っています。Rで統計を行うときにはこのデータの型を理解する必要があります。今回はデータの型について説明します。numericは数字のことです。numericの特徴としては四則演算(+,-,×,÷)ができます。1と2の間隔と2と3の間隔は同じです。numericには小数点以下がある実数(double)と整数(integer)でも使えます。文字"1"文字にあたるものはcharacterとなります。数字でも"1"のように""で挟むとcharacterとして認識されます。上記ではaは文字で1は数字なので「計算できません」とエラーが出ます。上記ではaに1という文字を入れたのでやはり計算できません。/order型はグループ分けしている時に使います。「1:不満足」を2倍をしても「2:やや満足」にならず四則演算ができないのも特徴です。factorは性別など順序がないものに使われ、orderは順番があるもの(10代〜、5段階評価など)に使われます。FALSEがあります。することで、60未満をTRUE、それ以外をFALSEとなります。TRUEは1、FALSEは0とみなすことができ、sum関数でTRUEの合計を、mean関数で割合(ここでは2/5=0.4)を出すことができます。TRUE/FALSE以外にもExcelのセルが空欄の時に表示されるNULLがあります。20180とNULLの違いはこのツイートが最強です。class()とstr()ではどうやって型を確認すればいいのでしょうか?これはclass関数やstr関数を使います。class()上記のようにclass(変数名)とします。aとbは同じ1でも型が違うのがわかります。str()上記でも紹介しましたが、data.frameはベクトルの集合体とも言えます。各列には「氏名(文字)、年齢(数値)、性別(男性/女性の2カテゴリー)」など色々な種類のデータが入っています。Rで統計を行うときにはこのデータの型を理解する必要があります。str関数は各列(ベクトル)の型をまとめて調べることができます。右上の表をdataという変数名に入れています。赤枠で囲ったところに型があります。性別を見るとfactorで"女性"と"男性"の2カテゴリーであることがわかります。型を変えるにはas.〜関数を使います。as.character()先程のstr(data)の氏名を見ると型はfactorになっています。これをcharacterに変えてみます。コード結果data$氏名がわかりにくかったら医療統計をRで使うために必要な「データフレーム」にの考え方ついてを参照してください。as.character(data$氏名)とするだけでは不十分です。as.character(data$氏名)とすることでas.character(data$氏名)をdata$氏名に入れてね!という意味になります。入れないと最後の結果が更新されていません。as.character(data$氏名)だけだとdata$氏名をcharacterにした結果を出してまでの意味しかないので注意してください。as.numeric()数値に変える時はas.numericを使います。コード結果もし整数にしたい時はas.integerを使います。orderedfactor型に変更するにはas.factor、factor、orderedなどを使います。dataに歩行という列を追加しています。ここでは0:非自立、1:監視、2:自立としています。最初はnumericと数値でしたが、as.factor関数を使うことでfactorに変わっています。ここではclassではなくstr(data$歩行)で型を確認しています。strを使うと型がfactorということだけでなく、levelsを見ると0,1,2の3つのカテゴリーがあることもわかります。0,1,2のままではグラフなどが困ります。その時はfactor関数(as.factorではないです)のlabelsを使うことでデータは0,1,2のまま表記を変えることができます。ちなみにfactorの順番はアルファベット順になってます。0,1,2などは問題ないのですが、大,中,小などでは小→大→中など望ましくない順番になることがあります。性別は女性→男性となっています。factorの並び順を変更するにはfactor関数のlevelsを使います。TRUEを付け加えます。EZRだと?EZRではアクティブデータセット→変数の操作にあたります。赤枠の「データセット内の変数を一覧する」はstr()を使っているだけです。まとめ今回は型について説明を行いました。型はRを使う上で非常に重要な考え方ですのでstr関数など使いながら確認する習慣をつけてみてください。次回は医療統計を行う上で必要になるtable1を作ることができるtableoneパッケージについて紹介します。全ての記事一覧はこちらです。【1-9】医療統計をRで使うために必要な「データフレーム」にの考え方ついてRで医療統計を行う場合ExcelでデータをとりRで読み込んで使うといった方法がほとんどだと思います。EZRやRコマンダーで統計を行うときは気にしなくてもいいのですが、RやRStudioで統計を行うときは「ベクトル」や「データフレーム(data.frame)」といった知識があると理解が進みやすいです。今回はdata.frameとベクトルについて解説していきます。data.frameとは?簡単にいうとExcelの表みたいな形式です。行(横)×列(縦)の形式になっています。EZRやRコマンダーを使う方はエクセルのデータを読み込んでいると思いますが、これがdata.frameになります。縦の列に変数名を入れることです。上は変数名にする一番上が変数名になるのでそれぞれ違う名前にしましょう。変数名が2段にならないようにしましょう。」などを使う方がエラーが出にくいです。」もマイナスの記号と間違われる可能性があります。計算しないRで簡単に求められます。エクセルには実データだけ入れないと、Rに集計の行が入り逆にRでの集計が正しくできません。ベクトルとは?上記のように1つのベクトルには複数のデータが入っています。ベクトルを使うときはc()を使います。"女性")となっていれば上のエクセルみたいなものだとイメージします。data.frameはベクトルの集合体とも言えます。データフレームをエクセルでなくRで作るときは1それぞれの列(ベクトル)をつくる。2data.frame関数でくっつけるといった方法で作成することができます(それぞれのデータの数は同じににしましょう)。