R中预测函数的问题

时间:2013-09-25 07:08:17

标签: r predict

我在R中使用predict()函数时遇到问题,我希望能得到一些帮助。考虑具有两列的数据集 - 1)Y,2)X

我的目标是使自然样条拟合得到95%CI,并将95%CI之外的点标记为异常值。这是我的工作:

1)最初,数据集中没有任何一点被标记为异常值。 2)我适合我的ns并使用其95%CI,我将CI外部的点标记为异常值 3)然后,我排除最初标记的异常值,并使用另一个ns并使用它的95%CI,我标记异常值。

*问题:* 假设我的初始数据集有1000个obs。我在第一轮标记了一些异常值,我得到了23个异常值。然后我使用剩余的977个非异常值拟合另一个ns(称之为fit.ns)。然后我使用所有X(全部1000)来获得基于这个新拟合的预测值,但是我得到警告和错误,我的预测函数中的newdata有1000个obs但是fit有977.返回的预测值也有977个值而不是1000。

*我的预测()代码*

# Fitting a Natural Spline Fit (df = 3 by default)
fit.ns <- lm(data.ns$IBI ~ ns(data.ns$Time, knots = data.ns$Time[knots]))

# Getting Fitted Values and 95% CI:
fit.ns.values <- predict(fit.ns, newdata = data.frame(Time = data.temp$Time), 
interval="prediction", level = 1 - 0.05) # ??? PROBLEM

我非常感谢你的帮助。

似乎我无法上传数据集,但我的代码是:

library(splines)
ns.knot <- 10
for (i in 1:2){
  # I exclude outliers so that my ns.fit does not get affected my outliers
  data.ns <- data.temp[data.temp$OutlierInd == 0,] 
  data.ns$BeatNum <- 1:nrow(data.ns) # BeatNum is like a row number for me and is an auxilary variable

  # Place Holder for Natural Spline results:
  data.temp$IBI.NSfit <- rep(NA, nrow(data.temp))
  data.temp$IBI.NSfit.L95 <- rep(NA, nrow(data.temp))
  data.temp$IBI.NSfit.U95 <- rep(NA, nrow(data.temp))

  # defining the knots in n.s.:
  knots <- (data.ns$BeatNum)[seq(ns.knot, (length(data.ns$BeatNum) - ns.knot), by = ns.knot)]

  # Fitting a Natural Spline Fit (df = 3 by default)
  fit.ns <- lm(data.ns$IBI ~ ns(data.ns$Time, knots = data.ns$Time[knots]))

  # Getting Fitted Values and 95% CI:
  fit.ns.values <- predict(fit.ns, newdata = data.frame(Time = data.temp$Time), interval="prediction", level = 1 - 0.05) # ??? PROBLEM
  data.temp$IBI.NSfit <- fit.ns.values[,1]
  data.temp$IBI.NSfit.L95 <- fit.ns.values[,2]
  data.temp$IBI.NSfit.U95 <- fit.ns.values[,3]

  # Updating OutlierInd based on Natural Spline 95% CI:
  data.temp$OutlierInd <- ifelse(data.temp$IBI < data.temp$IBI.NSfit.U95 & data.temp$IBI > data.temp$IBI.NSfit.L95, 0, 1)
}

2 个答案:

答案 0 :(得分:2)

最后,我找到了解决方案:

当我适合模型时,我应该使用“data =”选项。换句话说,而不是下面的命令,

# Fitting a Natural Spline Fit (df = 3 by default)
fit.ns <- lm(data.ns$IBI ~ ns(data.ns$Time, knots = data.ns$Time[knots]))

我应该使用以下命令:

# Fitting a Natural Spline Fit (df = 3 by default)
fit.ns <- lm(IBI ~ ns(Time, knots = Time[knots]), data = data.ns)

然后预测功能将起作用。

答案 1 :(得分:1)

我想添加评论,但我的代表级别不允许这样做。

无论如何,我认为这是一个记录良好的点,预测使用fit函数中使用的确切变量名称。因此,根据我的经验,命名变量是解决此错误的最佳方法。

因此,在上述情况下,请重新定义数据框,仅为了您的合适目的

library(splines)
#Fit part
fit.data <- data.frame(y=rnorm(30),x=rnorm(30))
fit.ns <- lm(y ~ ns(x,3),data=fit.data)

#Predict
pred.data <- data.frame(y=rnorm(10),x=rnorm(10))
pred.fit <- predict(fit.ns,interval="confidence",limit=0.95,data.frame(x=pred.data$x))

恕我直言,这应该摆脱你的错误