コードの記述
野外の生物調査では、しばしば種ごとの個体数をカウントするような場面があります。
例えば、鳥類の調査では"ラインセンサス法"がしばしば用いられます。
この調査では調査ルートを歩きながら、出現した鳥類の個体数を種ごとに記録していきます。
出現した種の個体数が、どのような環境要因の影響を受けているか、
を解析する際には一般化線形モデルや一般化線形混合モデルが用いられます。
しかし、種ごとにコードを書いていくのはめんどうです。
全ての種に対して、
共通のモデル
「応答変数(e.g., 各種の個体数) ~ 説明変数1(e.g., 土地利用割合) + 説明変数2(e.g., 景観割合)」
により解析したい場合にforループを使って一気に解析し、種ごとにcsvファイルに出力してくれるコードを書いてみました。
ただし、出現個体数の少ない種が多く含まれる場合などは、モデルが収束せず、ループが途中で止まってしまうので、あまり効率よくはありません。
そのような場合は、種を絞って解析するとよいと思います。
コードが汚いですし、もっと効率化できる気がします。
もっときれいなコードを発見できたら更新するかもしれません。
setwd("c:/Users/~~~") #ディレクトリの指定
allt <- read.csv("~~~.csv", header=T) #csvファイルの読み込み
x <- allt[,c(11:61)] #csvファイルから応答変数(e.g., 種ごとに整理した個体数)のみ抽出
value <- 1:51 #ループする応答変数の個数を指定
for(y in value){ #forループの宣言
ff <- formula(paste(names(x[y]), #paste関数を用いてglmの式を指定、応答変数を列数で指定
paste("~ 説明変数1 + 説明変数2",sep=""), sep="")) #説明変数は列名で指定
fmla <- glm(ff, data=allt, family=poisson) #上で指定したオブジェクトffを用いてGLM
assign(paste("res",y,sep=""),fmla) #assign関数を用いてデータフレーム"res1"-"res51"を作成
fmlb <- summary(fmla)$coefficient #GLMの係数だけ抽出
assign(paste("s.ans",y,sep=""),fmlb) #上で抽出した係数を"s.ans1"-"s.ans51"として格納
fmlc <- AIC(fmla) #モデルのAICを計算
assign(paste("aic",y,sep=""),fmlc)
mm <- formula(paste(names(x[y]), #以下からGLMMの解析
paste("~ 説明変数1 + 説明変数2 + (1|ランダム切片)"
,sep=""), sep=""))
m1 <- glmer(mm, data=allt, family=poisson)
assign(paste("res",y,sep=""),m1)
m2 <- summary(m1)$coefficient
assign(paste("s.ans",y,sep=""),m2)
m3 <- AIC(m1)
assign(paste("aic",y,sep=""),m3)
fmld <- cbind(fmlb,fmlc,m2,m3)
assign(paste("result",y,sep=""),fmld)
write.table(fmld,paste("フォルダ名/ファイル名",y,".csv",sep=""), #結果をcsv出力
append=T,quote=F,sep=",",row.names=T,col.names=T)
}