見出し画像

R言語による統計解析~繰り返し処理により解析を一気に終わらせる、そこから学んだこと~

統計解析ソフトには色々あるが、私はRとPythonしか用いていない。いずれも無料で開始出来、かつChatGPTとの親和性が高いから何とかなっているだけで、プロフェッショナルではないことを断っておきたい。プログラミング言語を用いた解析ではスクリプトが残るため、違ったdatasetに対しても同じ解析や可視化を行いやすいということがある。さらに、これから記載するfor構文を用いた繰り返し処理により上司からの無茶ぶりにも対応しやすくなると思うので、参考までに記していく。


R言語におけるfor構文

「R for構文」などで検索してみると、for構文の処理スピードが遅い旨の記載がある。そういった事情からか、あまりfor構文の実例がないのが現状だ。プログラミングには無駄のない処理を組み込むことが肝要なのだろうが、我々が行う統計解析に、そこまでの美学は不要な場合も多い。とにかく解析が楽になるよう、泥臭いスクリプトを書き溜めておく方がよっぽど大事だと自分は思っている。

ChatGPTによりfor構文は少し身近に。その前に使っていたスクリプトをここで供養する

chatGPTは、簡単な解析のスクリプト修正はすごく得意だ。for構文がうまく使えなかった人も、おそらくchatGPTにお願いすればfor構文は使えるだろう。ただ、その前に使っていたスクリプトもせっかくなのでここに記して供養したい。

#採血結果のみが格納されたdatasetAと仮定する
#1-15列目まで、異なる採血項目が格納されている
#1列目の採血結果はNa(ナトリウム)、2列目はK(カリウム)とする

#Na
df.cor.resultA<-data.frame()#forループのたびに上書きされる
df.cor.result_Na<-data.frame()#最終的な結果統合用
for (i in 1:15) {
  cor.result<-cor.test(datasetA$Na,datasetA[,i])
  names(cor.result)#ここは不要だったかも・・・
  coefficient.cor<-cor.result$estimate
  
  df.cor.resultA<-data.frame(coefficient.cor)#i番目の出力結果を代入
  df.cor.result_Na<-rbind(df.cor.result_Na,df.cor.resultA)#最後の行に1の結果を代入する
  
}
#K
df.cor.resultA<-data.frame()#forループのたびに上書きされる
df.cor.result_K<-data.frame()#最終的な結果統合用
for (i in 1:15) {
  cor.result<-cor.test(datasetA$K,datasetA[,i])
  names(cor.result)#ここは不要だったかも・・・
  coefficient.cor<-cor.result$estimate
  
  df.cor.resultA<-data.frame(coefficient.cor)#i番目の出力結果を代入
  df.cor.result_K<-rbind(df.cor.result_K,df.cor.resultA)#最後の行に1の結果を代入する
  
}
#以下、採血結果15個分を記載する

相関係数を15列分求め、最終的にはcorplotを書くために使用していたスクリプトだ。何をしているか簡単に解説すると、
①結果を格納する仮dataframeを作成。これはforループのたびに上書きされる
②Na(もしくはK)と15項目の相関係数を格納した最終結果格納用のdataframeを作成
③for構文の内部である。相関係数をNa vs 1-15列(Naも含んでいる)に対して算出する。cor.testの結果が格納されている部分をnames()で確認し、そこからcoefficient.corという名前で相関係数のみを抽出する。結果格納用仮dataframeに相関係数を格納する。rbind関数を用いることで、行の末尾に、1~15列分の結果が順々に格納されていく。

プロフェッショナルの方からすればなんてことはないだろうが、プログラミング初心者、統計初心者からすれば、このスクリプトを作るのは非常に苦労したことを覚えている。実は以下のyoutubeで解説されていたものの丸パクリである。アレンジした点といえばt.testではなくcor.testにしただけ、である。

for構文を解析で役立たせる肝。格納用dataframeを作成しておくこと。names関数で要素を抽出すること。

以降の解析でも役に立った概念として小見出しにあるような考え方がある。プログラミングに普段から触れていない自分からすると新鮮な驚きがあったのを記憶している。Rには様々な解析が用意されているが、結果が格納される形式にはいろいろあり、素人が解析しきれるものでは到底なかった。そこでおすすめしたいのが、とにかくnames関数にかけてみる、というものである。たまたま欲しい結果が格納されている要素を見つければしめたもの、そこから抽出し、用意していたdataframeにまとめれば、後は出力するなり、可視化するなり思いのままだ。次の記事ではとにかくnames関数にぶち込んで生まれた副産物的なggpairdの使い方について記載する。

自分の記事全般に言えることだが、コメントは大歓迎である。もっと簡単な方法あるよ!とか、それだと結果が違って出ちゃうよ!なんてコメント、お待ちしています。ぜひ勉強させて頂きたいと思っている。

この記事が気に入ったらサポートをしてみませんか?