2

这是一个相当简单的过程——用数据子集(训练集)重新拟合 GLM 模型并计算剩余数据的预测准确性。我正在尝试使用cv.glmpackage 的功能对数据集(即训练子集长度 = n-1)运行“留一法”策略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 回答