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

統計学備忘録(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!!!

sample

解析の練習で使うデータサンプル集 随時更新

sample1

症例 <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
性別 <- c("男性","男性","女性","男性","男性","女性","男性","男性","男性","男性","女性","女性","女性","女性","男性","女性","女性","女性","女性","男性")
治療 <- c("B","A","B","A","A","B","B","A","A","B","A","B","B","B","A","B","B","B","A","A")
治療前BP <- c(160,135,177,141,142,155,175,145,149,155,135,156,170,150,138,160,150,180,155,140)
治療後BP <- c(148,133,160,138,139,145,157,142,142,145,132,145,157,142,134,150,140,160,149,136)
BP変化量 <- c(12,2,17,3,3,10,18,3,7,10,3,11,13,8,4,10,10,20,6,4)
sample1 <- data.frame(症例,性別,治療,治療前BP,治療後BP,BP変化量 )

sample2
対応のある2群

ID <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
pre <- c(18, 8, 14, 15, 16, 13, 23, 20, 14, 20)
post <- c(23, 27, 15, 22, 15, 20, 20, 20, 18, 25)
sample2 <- data.frame(ID, pre, post)

sample3
独立した2群

グループ <- c("A","A","B","B","A","B","A","B","B","A","A","A","B","A","B","B","B","B","A","A")
ROMT <- c(18, 8, 23, 27, 14, 15, 15, 22, 15, 16, 13, 23, 20, 20, 20, 20, 18, 25, 14, 20)
sample3 <- data.frame(グループ, ROMT)

sample4
クロス表

sample4
判定 <- c(rep("非該当",30), rep("要支援", 25))
歩行 <- c(rep("可能", 20), rep("不可能", 10), rep("可能", 10), rep("不可能", 15))
sample4 <- data.frame(判定, 歩行)

テーブルをベクトルに変換

   症例 性別 治療 治療前BP 治療後BP BP変化量
1     1 男性    B      160      148       12
2     2 男性    A      135      133        2
3     3 女性    B      177      160       17
4     4 男性    A      141      138        3
5     5 男性    A      142      139        3
6     6 女性    B      155      145       10
7     7 男性    B      175      157       18
8     8 男性    A      145      142        3
9     9 男性    A      149      142        7
10   10 男性    B      155      145       10
11   11 女性    A      135      132        3
12   12 女性    B      156      145       11
13   13 女性    B      170      157       13
14   14 女性    B      150      142        8
15   15 男性    A      138      134        4
16   16 女性    B      160      150       10
17   17 女性    B      150      140       10
18   18 女性    B      180      160       20
19   19 女性    A      155      149        6
20   20 男性    A      140      136        4

上記テーブルの性別を切り出し
テキスト形式のベクトルに変換

data <- read.table("clipboard", header = T)
性別2 <- factor(data$性別)

install.packages("stringr")
library(stringr)

性別3 <- str_replace_all(性別2, pattern="k", replacement="*")
#性別3をwordで置換 スペースを,に変換

性別 <-c("男性","男性","女性","男性","男性","女性","男性","男性","男性","男性",
       "女性","女性","女性","女性","男性","女性","女性","女性","女性","男性")