我在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)
}
答案 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))
恕我直言,这应该摆脱你的错误