2

我在使用 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)。然后,我使用 ALL X(全部 1000)根据这个新拟合获得预测值,但我收到警告和错误,即我的预测函数中的新数据有 1000 个 obs 但拟合有 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)
}
4

2 回答 2

3

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

当我拟合模型时,我应该使用“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)

然后预测功能将起作用。

于 2013-09-25T20:56:34.637 回答
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))

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

于 2013-09-25T07:45:36.300 回答