2

これはかなり単純な手順です。データのサブセット (トレーニング セット) を使用して GLM モデルを再適合し、残りのデータで予測の精度を計算します。cv.glmpackageの関数を使用して、データ セット (つまり、トレーニング サブセットは長さ = n-1) に対して "leave-one-out" 戦略を実行しようとしていますboot

私は何か間違ったことをしていますか、それとも関数がNAを処理していないように見えるのは本当にそうですか? これは自分でプログラムするのはかなり簡単だと思いますが、他に間違いがある場合はアドバイスをいただければ幸いです。乾杯。

例:

require(boot)

#create data
n <- 100
x <- runif(n)
e <- rnorm(n, sd=100)
a <- 5
b <- 3
y <- exp(a + b*x) + e
plot(y ~ x)
plot(y ~ x, log="y")

ここに画像の説明を入力

#make some y's NaN
set.seed(1)
y[sample(n, 0.1*n)] <- NaN

#fit glm model
df <- data.frame(y=y, x=x)
glm.fit <- glm(y ~ x, data=df, family=gaussian(link="log"))
summary(glm.fit)

#calculate mean error of prediction (leave-one-out cross-validation)
cv.res <- cv.glm(df, glm.fit)
cv.res$delta
[1] NA NA   
4

1 に答える 1

2

あなたが正しい。関数は NA を処理するように設定されていません。na.action関数の引数のさまざまなオプションも、glm()実際には役に立ちません。これに対処する最も簡単な方法は、最初にデータ フレームから NA を削除することです。

sub <- df[!is.na(df$y), ]
glm.fit <- glm(y ~ x, data=sub, family=gaussian(link="log"))
summary(glm.fit)

# calculate mean error of prediction (leave-one-out cross-validation)
cv.res <- cv.glm(sub, glm.fit)
cv.res$delta
于 2013-05-28T14:05:34.247 に答える