Rのロジスティック回帰の代替


55

ロジスティック回帰と同じタスクを実行する多くのアルゴリズムが欲しいです。それは、説明変数(X)を使用してバイナリ応答(Y)に予測を与えることができるアルゴリズム/モデルです。

アルゴリズムに名前を付けた後、Rでそれを実装する方法も示すことができれば嬉しいです。他のモデルで更新できるコードは次のとおりです。

set.seed(55)
n <- 100
x <- c(rnorm(n), 1+rnorm(n))
y <- c(rep(0,n), rep(1,n))
r <- glm(y~x, family=binomial)
plot(y~x)
abline(lm(y~x), col='red', lty=2)
xx <- seq(min(x), max(x), length=100)
yy <- predict(r, data.frame(x=xx), type='response')
lines(xx, yy, col='blue', lwd=5, lty=2)
title(main='Logistic regression with the "glm" function')

予測子の固定セットを検討していると仮定する必要がありますか?つまり、予測子が与えられた場合に信頼性の高い予測を取得することに興味がありますか、または?X jkXj(j=1k)
-chl

私の個人的な利益のために、ペナルティは必要ないことを認めます、そして、ここでの知識のために、私は両方が関連する答えであると言うでしょう:)
タルガリリ

将来の参考のために、この質問を非CWの質問として許可するような方法で表現することができたかもしれません。meta.stats.stackexchange.com/questions/290/を
シェーン

リンクシェーンありがとうございます。そこで開かれた非常に興味深い議論。Thomasasの回答を読んだ後、これはコミュニティwikiであるべきだと思っています。私の意図は、できるだけ多くの選択肢を見つけることでした(誰かが提供できるとは思えないことです)。それでも、再び、そのスレッドに私を向けてくれてありがとう!
タルガリリ

これはあまりにも広すぎず、答えることができません。現在、6つの回答(5つの投票済み)があります。さらに、質問は非常に支持されており、非常にお気に入りであり、CWです。IMO、オープンのままにしてください。
グング-モニカの復職

回答:


28

現在人気のあるのはrandomForestとgbm(機械学習の文献ではMARTまたはGradient Boostingと呼ばれます)、単純なツリーのrpartです。bayesglmも人気があります。これは、MAPを使用して、正規化のために事前分布を行います。

install.packages(c("randomForest", "gbm", "rpart", "arm"))

library(randomForest)
library(gbm)
library(rpart)
library(arm)

r1 <- randomForest(y~x)
r2 <- gbm(y~x)
r3 <- rpart(y~x)
r4 <- bayesglm(y ~ x, family=binomial)

yy1 <- predict(r1, data.frame(x=xx))
yy2 <- predict(r2, data.frame(x=xx))
yy3 <- predict(r3, data.frame(x=xx))
yy4 <- predict(r4, data.frame(x=xx), type="response")

24

実際、それはあなたが何を得たいかによって異なります。予測に対してのみロジスティック回帰を実行する場合、データに適した教師付き分類方法を使用できます。別の可能性:判別分析(パッケージMASSのlda()およびqda())

r <- lda(y~x) # use qda() for quadratic discriminant analysis

xx <- seq(min(x), max(x), length=100)
pred <- predict(r, data.frame(x=xx), type='response')
yy <- pred$posterior[,2]

color <- c("red","blue")

plot(y~x,pch=19,col=color[pred$class])
abline(lm(y~x),col='red',lty=2)
lines(xx,yy, col='blue', lwd=5, lty=2)
title(main='lda implementation')

一方、予測の信頼区間や推定値の標準誤差が必要な場合、ほとんどの分類アルゴリズムは役に立ちません。多数のパッケージが利用可能な、一般化された加算(混合)モデルを使用できます。私はよくSimon Woodのmgcvパッケージを使用します。一般化された加算モデルでは、予測子のモデリングにスプラインを使用できるため、ロジスティック回帰よりも柔軟性があります。

set.seed(55)
require(mgcv)
n <- 100
x1 <- c(rnorm(n), 1+rnorm(n))
x2 <- sqrt(c(rnorm(n,4),rnorm(n,6)))
y <- c(rep(0,n), rep(1,n))
r <- gam(y~s(x1)+s(x2),family=binomial)

xx <- seq(min(x1), max(x1), length=100)
xxx <- seq(min(x2), max(x2), length=100)
yy <- predict(r, data.frame(x1=xx,x2=xxx), type='response')

color=c("red","blue")
clustering <- ifelse(r$fitted.values < 0.5,1,2)

plot(y~x1,pch=19,col=color[clustering])
abline(lm(y~x1),col='red',lty=2)
lines(xx,yy, col='blue', lwd=5, lty=2)
title(main='gam implementation')

まだまだやることがたくさんあります。

op <- par(mfrow=c(2,1))
plot(r,all.terms=T)
par(op)

summary(r)
anova(r)

r2 <- gam(y~s(x1),family=binomial)
anova(r,r2,test="Chisq")

...

Generalized Additive ModelsについてのSimon Wood本をお勧めします


14

私はジョーに同意し、追加します:

原則としてどの分類方法でも使用できますが、データ/状況に依存します。たとえば、一般的なC-SVMモデルでSVMを使用することもできます。動径基底カーネル関数を使用したkernlabの例を次に示します。

library(kernlab)
x <- rbind(matrix(rnorm(120),,2),matrix(rnorm(120,mean=3),,2))
y <- matrix(c(rep(1,60),rep(-1,60)))

svp <- ksvm(x,y,type="C-svc")
plot(svp,data=x)

12

キャレットパッケージを介してトレーニング可能な約100の分類および回帰モデルがあります。分類モデルのいずれかを選択できます(回帰モデルでは、継続的な応答が必要です)。たとえば、ランダムフォレストをトレーニングするには:

library(caret)
train(response~., data, method="rf")

利用可能なモデルの完全なリストについては、ディストリビューションに付属のキャレットモデルトレーニングビネットを参照してください。これは、二重使用モデルと分類モデル(どちらも使用可能)と回帰のみ(使用不可)に分かれています。キャレットは、選択したモデルのパラメーターを自動的にトレーニングします。


7

Naive Bayesは、バイナリ応答を見つけるためのトレーニングデータの優れた簡単な方法です。

library(e1071)
fitNB <- naiveBayes(y~x)
predict(fitNB, x)

3

ロジスティック回帰には、まだ概説されていない2つのバリエーションがあります。まず、ロジスティック回帰では、累積ロジスティック分布(シグモイドとも呼ばれる)であるロジスティック関数を使用して確率を推定します。他の分布から導出された関数を使用して、確率を推定することもできます。ロジスティック回帰とは別に最も一般的な方法は、正規分布から導出されるプロビット回帰です。プロビットとロジットの違いの詳細については、次のサイトをご覧ください。

ロジットモデルとプロビットモデルの違い

set.seed(55)
n <- 100
x <- c(rnorm(n), 1+rnorm(n))
y <- c(rep(0,n), rep(1,n))
r <- glm(y~x, family=binomial(link="probit"))
plot(y~x)
abline(lm(y~x),col='red',lty=2)
xx <- seq(min(x), max(x), length=100)
yy <- predict(r, data.frame(x=xx), type='response')
lines(xx,yy, col='red', lwd=5, lty=2)
title(main='Probit regression with the "glm" function')

2番目の選択肢は、実装したロジスティック関数の1週間を示しています。サンプルサイズが小さい場合や欠損値がある場合は、ロジスティック関数はお勧めできません。したがって、正確なロジスティック回帰はより良いモデルです。結果の対数オッズは、予測変数の線形結合としてモデル化されます。

elrm(formula = y ~ x)

さらに、言及されるような他の選択肢があります:

  1. 双方向分割表
  2. 2グループの判別関数分析。
  3. ホテリングのT2。

最後の注意:ロジスティック回帰は、隠れ層がなく、最終層の1点のみのない小さなニューラルネットワークと同じです。したがってnnet、R などのニューラルネットワークパッケージの実装を使用できます。

編集:

数週間後、私もそこにあることに気づき 選り抜くパーセプトロンアルゴリズム。どちらも2つのグループへの分類にも機能する分類子ですが、どちらも過去15年間で好意的ではなくなりました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.