使用平滑样条预测带有NA的新数据

3
我正在进行一个smooth.spline()拟合,并使用该拟合进行预测。我的问题是,我的新数据中有一些NAs。现在我正在尝试使预测也出现NAs。但是我无法使其工作。
我编写了一些可重现的代码来说明我的问题。我希望我的新数据和预测结果具有相同的长度。例如,当使用loess模型进行预测时,我没有遇到这个问题。如果x为NA,则它会自动将NA放入y。我看到了其他模型(例如lmglm等)的预测问题,但是设置na.action=na.exclude并不能解决我的问题。
x <- c(1:5, NA, 7:12, NA, 15:19, 22:23)
y <- rnorm(length(x))
y[which(is.na(x))] <-NA
length(y) #20

x.new <- c(x[1:18],20,21,x[19:20])
length(x.new) #22

spl <- smooth.spline(x=x[!is.na(y)], y=y[!is.na(y)], spar=0.001)
spl.pr <- predict(spl, x=x.new[!is.na(x.new)], na.action=na.exclude)
length(spl.pr$y) #20

如果我不在predict中排除NAs,我的预测命令也无法正常工作。例如:

> spl.pr <- predict(spl, x=x.new, na.action=na.exclude)
Error in double(n) : vector size cannot be NA

我希望您能理解我的问题。非常感谢您的帮助。

1个回答

3

predict 在不同的模型类中表现不同。对于 stats:::predict.smooth.splinestats:::predict.smooth.spline.fit,没有 na.action 选项。因此,您只能在非 NA 值上进行预测。

spl.pr <- rep(NA, length(x.new))
spl.pr[!is.na(x.new)] <- predict(spl, x = x.new[!is.na(x.new)])$y

请注意,spl.pr不是带有$x$y的列表,而是数值向量。

好的,我猜到了。但我不确定,因为在命令中使用na.action = na.exclude时没有收到错误消息。你推荐的方法很有效,谢谢!

@Katharina 哈哈,你没有收到错误,是因为predict()函数中有一个...参数。因此,基本上可以将任何未使用的参数传递给它。试试这个吧。

predict(spl, x = 5, this.answer.is.useful = TRUE)

玩得开心!


好的,我本来就有这个怀疑。不过我不确定,因为在命令中使用na.action=na.exclude时没有收到错误消息。你推荐的解决方法很好,谢谢!(我已经给你的答案点赞了,不幸的是,在我获得一定数量的徽章之前,它不会在公开场合显示出来- 我想是10个徽章;编辑:现在似乎可以显示了) - Katharina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接