単回帰分析を一括で実行する方法
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!!!