理学療法士がまとめたノート

統計学備忘録(R言語のメモ)

since2016 ときどきTEXのメモ

単回帰分析を一括で実行する方法

tokei.net 全人類が分かる統計学より
to-kei.net

上記サイトに自分なりの注釈をつけました。
sampleもまったく同じです。

番号 <- c(1:30)
年齢 <- c(22,23,24,25,27,28,28,29,30,31,32,32,33,33,34,36,37,37,38,39,40,42,46,49,50,53,56,58,64,65)
血圧 <- c(110,128,104,112,108,126,126,104,125,120,116,124,106,134,128,128,116,132,134,116,120,130,126,140,156,124,118,144,142,144)
肺活量 <- c(110,128,104,112,108,126,126,104,125,120,116,124,106,134,128,128,116,132,134,116,120,130,126,140,156,124,118,144,142,144)
性別 <- c("M","M","F","F","M","F","F","F","F","F","M","M","F","F","M","M","M","M","F","M","F","F","M","F","M","M","M","M","F","F")
病気 <- c(1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,0,0,1,1,1,0,1,0)
体重 <- c(79,65,53,45,80,50,43,55,47,49,64,61,48,41,70,55,70,90,39,86,50,65,58,45,60,71,62,51,40,42)
data <- data.frame(番号, 年齢, 血圧, 肺活量, 性別, 病気, 体重)

head(data, n=3)

dat <- data
names(dat)[6] <- "Y" # 6列目をYに変更

#まず関数を作成して、どんな解析の、どこの結果を記載するのか決めます
#func01は、関数名なのでなんでもOK、他は特に変更する必要なし

func01 <- function(dat,filename,response) 
{
  ans <- lm(dat$Y~.,data=dat)    #重回帰
  s.ans=summary(ans)     #重回帰の要約
  coe <- s.ans$coef    #重回帰の結果(係数、標準誤差、t値、p値)
  CI.low <- coe[,1]-1.96*coe[,2]    #係数の検定結果 95%信頼区間下限
  CI.up <- coe[,1]+1.96*coe[,2]    #係数の検定結果 95%信頼区間上限
  aic <- AIC(ans)     #AIC
  N <- nrow(dat)    #セットの行数
  result <- cbind(coe,CI.low,CI.up,aic,N)    #95%信頼区間とAICを合体
  result[2:nrow(result),c(7,8)]=""   #2行目以降の7、8列目を空白にする・・・?
  res <- paste("Y = ",response)    #単回帰の結果の1行目の文字列になる
  #ファイルの構成
  write.table(res,filename,append=T,quote=F,sep=",",row.names=F,col.names=F)
  write.table(matrix(c("",colnames(result)),nrow=1),filename,append=T,quote=F,sep=",",row.names=F,col.names=F)
  write.table(result,filename,append=T,quote=F,sep=",",row.names=T,col.names=F)
  write.table("",filename,append=T,quote=F,sep=",",row.names=F,col.names=F)
}

filename <- "てすとファイル1.csv"    #ファイル名を作成

df1 <- dat[,-1]    #番号をカット(入れてても問題なし)
for(i in 1:ncol(df1))    #列数分繰り返す(6回)
{
  if(i != 5) #5回目(5行目)を回避
  {
    #単回帰を繰り返すために2列のデータフレームを作成(ここでは5列目が目的変数)
    dat2 <- df1[ , c(5,i)]
    colnames(dat2)[1] = "Y"      #2列になったdatの1列目が目的変数
    func01(dat2, filename, "病気")    #各解析結果の1行目Y =の後に目的変数名「病気」を挿入
  }
}

#if(i != 5)
#5回目(5行目)を回避しなくてもやれる!

dat <- data
names(dat)[6] <- "Y"     # 6列目をYに変更
filename <- "てすとファイル2.csv"
df2 <- dat[,-1]     #IDをカット 入れてても大丈夫

for(i in 1:ncol(df2))    #列数分繰り返す(6回)
{
  dat3 <- df2[,c(5,i)]
  colnames(dat3)[1] = "Y" #datが2列
  func01(dat3, filename, "病気") #ここで目的変数を挿入
}

#同じ変数同士で、fitし過ぎているので注意されます
#essentially perfect fit!!!