使用自然样条拟合进行预测

时间:2013-08-13 18:44:09

标签: r spline

我有一个简单的自然样条(df = 3)模型,我试图预测一些样本观察。使用函数predict(),我能够获得样本内观察值的拟合值,但我无法得到新观察值的预测值。

这是我的代码:

library(splines)

set.seed(12345)
x <- seq(0, 2, by = 0.01)
y <- rnorm(length(x)) + 2*sin(2*pi*(x-1/4))

# My n.s fit:
fit.temp <- lm(y ~ ns(x, knots = seq(0.01, 2, by = 0.1)))

# Getting fitted values:
fit.temp.values <- predict(fit.temp,interval="prediction", level = 1 - 0.05)

# Plotting the data, the fit, and the 95% CI:
plot(x, y, ylim = c(-6, +6))
lines(x, fit.temp.values[,1], col = "darkred")
lines(x, fit.temp.values[,2], col = "darkblue", lty = 2)
lines(x, fit.temp.values[,3], col = "darkblue", lty = 2)

# Consider the points for which we want to get the predicted values:
x.new <- c(0.275, 0.375, 0.475, 0.575, 1.345)

如何获取x.new的预测值?

非常感谢你的帮助,

P.S。我在SO上搜索了所有相关问题,但我找不到答案。

2 个答案:

答案 0 :(得分:7)

使用名为x的列创建数据框,并将其作为newdata参数传递给predict

predict(fit.temp, newdata=data.frame(x=x.new))

答案 1 :(得分:2)

您要将单个向量发送到lm。如果你想看看这里出了什么问题,那么输入:

 fit.temp$terms

...并注意到x-predictor的名称是:

attr(,"term.labels")
[1] "ns(x, knots = seq(0.01, 2, by = 0.1))"

您需要为predict提供一个列表x作为lm的名称。将lm.predict df <- data.frame(x,y) # My n.s fit: fit.temp <- lm(y ~ ns(x, knots = seq(0.01, 2, by = 0.1)) , data=df) predict(fit.temp, newdata=list(x =c(0.275, 0.375, 0.475, 0.575, 1.345) ) ) # 1 2 3 4 5 #0.9264572 1.6549046 2.0743470 1.9507962 0.8220687 points(x.new, predict(fit.temp, newdata=list(x =c(0.275, 0.375, 0.475, 0.575, 1.345) )), col="red", cex=2) 与数据框参数一起使用会更容易,因此可以通过内部重新评估新值来完成预测。

{{1}}