Rで、AICとBICがどの相互検証方法と同等であるかを経験的に実証するにはどうすればよいですか?


26

質問他の場所でこのサイトには、いくつかの答えは、AICは(LOO)クロスバリデーションを-1を残し、BICはK倍クロスバリデーションと同等であることと等価であることを述べました。これをRで経験的に実証する方法はありますか。LOOとKフォールドに関連する技術が明確になり、AICとBICの値と同等であることが実証されますか。この点に関しては、十分にコメントされたコードが役立ちます。また、BICのデモでは、lme4パッケージを使用してください。サンプルデータセットについては、以下を参照してください...

library(lme4) #for the BIC function

generate.data <- function(seed)
{
    set.seed(seed) #Set a seed so the results are consistent (I hope)
    a <- rnorm(60) #predictor
    b <- rnorm(60) #predictor
    c <- rnorm(60) #predictor
    y <- rnorm(60)*3.5+a+b #the outcome is really a function of predictor a and b but not predictor c
    data <- data.frame(y,a,b,c) 
    return(data)    
}

data <- generate.data(76)
good.model <- lm(y ~ a+b,data=data)
bad.model <- lm(y ~ a+b+c,data=data)
AIC(good.model)
BIC(logLik(good.model))
AIC(bad.model)
BIC(logLik(bad.model))

以前のコメントごとに、以下に、AICとBICが同意しない1〜10000のシードのリストを示しました。これは、利用可能なシードを介した簡単な検索によって行われましたが、これらの2つの情報基準から異なる答えを生成する傾向があるデータを生成する方法を誰かが提供できれば、特に有益です。

notable.seeds <- read.csv("http://student.ucr.edu/~rpier001/res.csv")$seed

余談ですが、AICとBICの絶対差の合計として定量化しようとしたAICとBICの不一致の程度によって、これらのシードを並べることを考えました。例えば、

AICDiff <- AIC(bad.model) - AIC(good.model) 
BICDiff <- BIC(logLik(bad.model)) - BIC(logLik(good.model))
disagreement <- sum(abs(c(AICDiff,BICDiff)))

ここで、意見の相違が認められるのは、観察が顕著である場合にのみ合理的に適用されます。例えば、

are.diff <- sum(sign(c(AICDiff,BICDiff)))
notable <- ifelse(are.diff == 0 & AICDiff != 0,TRUE,FALSE)

ただし、AICとBICが一致しなかった場合、計算された不一致値は常に同じでした(また、サンプルサイズの関数です)。AICとBICがどのように計算されるかを振り返ると、なぜ計算上そうなるのかがわかりますが、なぜ概念的にそうなるのかはわかりません。誰かが同様にその問題を解明できれば、私はそれを感謝します。


+1コードは簡単に記述できますが、それでも明確でわかりやすいデータセットを見ることに非常に興味があります。

明確でわかりやすいデータセットに何が必要かはわかりませんが、サンプルのデータセットを含めることを試みました。
ラッセルピアス

見てください:BICとAICは同じ結果をもたらすので、あなたが提供したものは役に立たないセットの例です:AICでは340 v。342、BICでは349 v。353-両方のケースでgood.modelが勝ちます。その収束の全体的な考え方は、特定の交差検証が対応するICと同じモデルを選択するということです。

私は単純なスキャンを行いましたが、たとえばシード76についてはICが同意しません。

1
うわー、これは私が得るのがさらに難しいものです。全体の議論における私の一般的なポイントは、これらの定理の収束が弱すぎるため、ランダムな変動から差異が生じる可能性があるということです。(そして、それは機械学習のために機能していませんが、これが明白であることを望みます。)

回答:


5

私自身の質問に部分的に答えようとする試みで、ウィキペディアの leave-one-out相互検証説明を読みました

元のサンプルの単一の観測値を検証データとして使用し、残りの観測値をトレーニングデータとして使用します。これは、サンプル内の各観測が検証データとして一度使用されるように繰り返されます。

Rコードでは、それはこのようなことを意味すると思う...

resid <- rep(NA, Nobs) 
for (lcv in 1:Nobs)
    {
        data.loo <- data[-lcv,] #drop the data point that will be used for validation
        loo.model <- lm(y ~ a+b,data=data.loo) #construct a model without that data point
            resid[lcv] <- data[lcv,"y"] - (coef(loo.model)[1] + coef(loo.model)[2]*data[lcv,"a"]+coef(loo.model)[3]*data[lcv,"b"]) #compare the observed value to the value predicted by the loo model for each possible observation, and store that value
    }

... AICに関連する残余の値を生成することになっています。実際には、上で詳述したLOOループの各反復からの2乗残差の合計は、notable.seedsのAICの良い予測子、r ^ 2 = .9776です。しかし、他の場所で寄稿者は、LOOがAICと漸近的に同等であるべきだと提案したので(少なくとも線形モデルの場合)、r ^ 2が1に近くないことに少しがっかりしています。明らかにこれは本当に答えではありません-より良い答えを提供しようとする誰かを奨励しようとする追加コードのようなものです。

補遺:固定サンプルサイズのモデルのAICとBICは定数によってのみ変化するため、BICと2乗残差の相関関係はAICと2乗残差の相関関係と同じであるため、上記のアプローチは実を結ばないように見えます。


これが賞金の受け入れられた答えになることに注意してください(答えを選択しない場合、賞金は自動的に最もポイントの多い答えを選択します)
ロビンジラール

1
まあ-私に賞金を授与することはばかげているように見えます-しかし、誰も答えを提出していません。
ラッセルピアス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.