我想计算R中smooth.spline拟合函数的Cv误差,但是,它显示以下误差:

我的函数应返回一个data.frame对象,该对象给出以下多项式的K倍误差估计:多项式回归,三次样条和平滑样条,其自由度范围为df.mindf.max 。但是,我的平滑样条曲线不能像其他两个模型那样工作,它显示了以下错误:data $ y [-train]-preds2中的错误:二进制运算符的非数字参数。 I wonder why poly and cubic spline is working but not smoothing spline?有人知道如何解决这个问题吗?

# This part is working fine
smoothCV_1 <- function(x,y,K = 10,df.min = 1,df.max = 10) {
  train=sample (c(TRUE,FALSE),nrow(spline.data),rep=TRUE)
  cv.error2 <- rep(0,10)
  for (i in 1:10) {
    if(i >= 3) {
      spline.fit <- lm(y ~ bs(x,i),data = spline.data,subset = train)
      preds1 <- predict(spline.fit,data)[-train]
      cv.error[i]= mean((data$y[-train] - preds1)^2)

      glm.fit = glm(y ~ poly(x,data=spline.data,subset = train)
      preds2 <- predict(glm.fit,data)[-train]
      cv.error2[i]= mean((data$y[-train] - preds2)^2)
    } else {
      cv.error[i]= NA

      glm.fit = glm(y ~ poly(x,data)[-train]
      cv.error2[i]= mean((data$y[-train] - preds2)^2)
    }
  }
  cv.df <- data.frame(degree = 1:10,cv.error = cv.error,cv.error2 = cv.error2)
  return(cv.df)
}
smoothCV_1(x,10,1,10)
# This part is problematic
smoothCV_3 <- function(x,10)
  for (i in 1:10) {
    if(i >= 1) {
      fit2 <- with(smooth.spline(x,df=i),subset = train)
      preds2 <- predict(fit2,data)[-train]
#This part shows error:
#Error in data$y[-train] - preds2 : non-numeric argument to binary operator
      cv.error2[i]= mean((data$y[-train] - preds2)^2)
      print(cv.error[i])
    } else {
      cv.error2[i]= NA
    }
  }
  cv.df <- data.frame(degree = 1:10,cv.error2 = cv.error2)
  return(cv.df)
}
smoothCV_3(x,10)
myzhan 回答:我想计算R中smooth.spline拟合函数的Cv误差,但是,它显示以下误差:

此行以列表格式输出2列数据帧:

preds2 <- predict(fit2,data)[-train]

假设我们在此处复制了您的代码:

df_ <- data.frame(x = c(1,2,3,4,1,4),y = c(0,0))
train=sample(c(TRUE,FALSE),nrow(df_),rep=TRUE)
fit2 <- with(smooth.spline(x,y,df=i),data=df_,subset = train)

当我运行以下代码:preds2 <- predict(fit2,data)[-train]时,首先,predict()的输出将不会更改,因为[-train]是列选择,如果要选择行,请执行此操作[-train,]

第二个输出是

$y
   x y
1  0 0
2  0 0
3  0 0
4  0 0
5  0 0
6  0 0
7  0 0
8  0 0
9  0 0
10 0 0
11 0 0
12 0 0

因此,您基本上只需获取数据帧列表即可。

解决问题的一种方法:

preds2 <- predict(fit2,df_)$y$y[-train]
本文链接:https://www.f2er.com/3135838.html

大家都在问