「喰う・書く・逃げる」に棲む処

 動物に関するデータ分析者のブログです

ピアソンの相関検定とR値またはR二乗値を総当たりで計算するR関数を作ってみた

ピアソンの相関検定を総当たりしてくれるRの関数を作ってみました。 煮るなり焼くなりご自由にお使いください。ただしご自身の責任で。

ソースコード

cor.all=function(df,name_list,r.pow2=T,digits=4){
  #df:データフレームを指定
  #name_list:列名のリストをベクトル形式で指定
  #r.pow2:R二乗値を返すかどうか
  #digits:何桁で表示するか
  cm_p=combinat::combn(name_list,m=2)
  cor_data=apply(cm_p,2,function(x){
    #  x=cm_p[,1]
    df_x=df%>%dplyr::select(x[1],x[2])
    df_x=as.data.frame.table(df_x)
    ct=cor.test(c(df_x[,3]),c(df_x[,4]))
    if(r.pow2){
      q=ct$estimate^2
    }else{
      q=ct$estimate
    }
    paste0(round(q,digits = digits),if(ct$p.value<0.05){
      #paste0(ct$estimate^2,if(ct$p.value<0.05){
      if(ct$p.value<0.01){
        if(ct$p.value<0.001){
          " ***" #Pが0.001以下
        }else{
          " **"  #Pが0.01以下
        }
      }else{
        " *"     #Pが0.05
      }
    })
  })
  cor_vec=c("",cor_data[1:(length(name_list)-1)])
  cor_i=c(1,length(name_list)-1)
  for(i in 2:(length(name_list)-1)){
    cor_i=c(cor_i,
            cor_i[2*(i-1)-1]+sum(length(name_list):length(name_list)-i+1),
            cor_i[2*(i-1)-1]+sum(length(name_list):length(name_list)-i+1)+length(name_list)-1-i)
    cor_vec=c(cor_vec,rep("",i),
              cor_data[cor_i[2*(i)-1]:cor_i[2*(i)]])
  }
  matrix(cor_i,ncol=2,byrow = T)
  df_out=matrix(cor_vec,ncol=length(name_list),byrow = T)
  dimnames(df_out)=list(c(name_list[1:nrow(df_out)]),c(name_list[1:ncol(df_out)]))
  return(df_out)
}

使い方

1.上記のコードをコピペしてから実行します。

2.以下のように変数を指定してください。

cor.all(df,name_list,r.pow2=T,digits=4)

df: データフレームを指定

name_list: 総当たりで相関の関係を調べたい列名をベクトルで指定(例:c("気温", "水温", "湿度")

r.pow: TRUEでR二乗値を計算(デフォルト)、FALSEでR値を計算します

digits: 表示するR二乗値またはR値の小数点以下の桁数

3.結果がマトリックスで表示されます。P値が0.001以下なら***、0.01以下なら**、0.05以下なら*が数字の右側につきます。