総当たり法によるロジスティック回帰分析 Last modified: Aug 27, 2009
目的
総当たり法によるロジスティック回帰分析を行う。
使用法
all.logistic(df, limit)
print.all.logistic(obj, sort.by=c("adj", "rsq", "AIC"))
引数
df データフレーム(従属変数を最後の列に置く)
limit 独立変数の個数の制限値。標準では 10 個
注意:独立変数が多いと莫大な計算時間がかかり,出力行数も増える
独立変数が1個増えるだけで,計算時間はほぼ 2 倍になり,出力行数は 2 倍になる
obj
sort.by モデルの適否を表す3種の統計量のどれでソートして結果を表示するかの選択
デフォルト("adj")では 結果を deviance の大きい順にソートして出力する。
"AIC" を指定すると,結果を AIC の小さい順にソートして出力する。
models よいモデルから mmodels 番目までを表示する(デフォルトは 20)
ソース
インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/all.logistic.R", encoding="euc-jp")
# 総当たり法によるロジスティック回帰を行う
# データフレームには,分析に使用する独立変数と従属変数のみを含むこと。
# また,従属変数は最終列に置くこと。
#
all.logistic <- function( df, # データフレーム(独立変数)
limit=10) # 独立変数の個数の上限(数が多いと計算時間が指数的に増える)
{
df <- subset(df, complete.cases(df)) # 欠損値を持つケースを除く
nv <- ncol(df)-1 # 独立変数の個数
if (nv > limit) { # limit より多いと分析を中断する
stop(paste("独立変数が", limit,
"個以上である(多すぎる)。\n",
"limit 引数で変更できる", paste=""))
}
n <- 2^nv # 独立変数を取り出す取り出し方
bincomb <- matrix(FALSE, nrow=n, ncol=nv) # e1071 パッケージの bincombinations より
for (j in 1:nv) {
bincomb[, j] <- rep(c(rep(FALSE, n/2^j), rep(TRUE, n/2^j)), length = n)
}
bincomb <- bincomb[-1,]
n <- n-1
name <- names(df) # 変数名を取り出す
depname <- name[nv+1]
name <- name[1:nv]
result3 <- character(n) # 数値型ベクトル確保
result1 <- result2 <- numeric(n) # 数値型ベクトル確保
for (i in 1:n) { # 独立変数の全ての組み合わせについて,
str <- name[bincomb[i,]] # どの独立変数が使われるかを割り出す
form <- reformulate(str, depname) # モデル式を作る("formula" クラス)
ans <- glm(form, df, family=binomial) # ロジスティック回帰分析の結果
result <- summary(ans)
result1[i] <- result$deviance # deviance
result2[i] <- result$aic # AIC
temp <- as.character(form) # モデル式を文字列に変換
result3[i] <- paste(temp[2], "~", temp[3]) # モデル式を記録
}
return(structure(list(deviance=result1, AIC=result2, formula=result3),
class="all.logistic"))
}
# print メソッド
print.all.logistic <- function( obj, # "all.logistic" クラスのオブジェクトをプリント
sort.by=c("deviance", "AIC"), # 結果を何で並べ替えるかを指示
models=20) # 良い方から何番目まで出力するか
{
result <- data.frame(obj$deviance, obj$AIC, obj$formula)
sort.by <- match.arg(sort.by)
o <- order(switch (sort.by, "deviance"=result[,1], "AIC"=result[,2]))
result <- result[o,]
cat(sprintf("\n%12s %12s %s\n", "deviance", "AIC", "Formula")) # 表頭
models <- min(models, nrow(result))
apply(result[1:models,], 1, function(x) # 各行の出力
cat(sprintf("%12.5f %12.5f %s\n",
as.double(x[1]), as.double(x[2]), x[3])))
invisible(result)
}
使用例
> lr <- read.table("lr.data", header=TRUE)
> all.logistic(lr) # lr.data を分析してみる
deviance AIC Formula
72.18397 78.18397 y ~ x1 + x2
72.33492 76.33492 y ~ x2
76.25592 80.25592 y ~ x1
直前のページへ戻る
E-mail to Shigenobu AOKI