Я хочу вычислить ошибку cv функции подгонки smooth.spline в R, однако она показывает ошибку ниже: - PullRequest
0 голосов
/ 08 ноября 2019

Моя функция должна возвращать объект data.frame, дающий K-кратные оценки ошибок для: полиномиальной регрессии, кубических сплайнов и сглаживающих сплайнов со степенями свободы в диапазоне от df.min до df.max. Однако мои сглаживающие сплайны не работают, как две другие модели, они показывают эту ошибку: Ошибка в данных $ 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, i), 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, i), data=spline.data, subset = train)
      preds2 <- predict(glm.fit, 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,y,10,1,10)
# This part is problematic
smoothCV_3 <- 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 >= 1) {
      fit2 <- with(smooth.spline(x, y, df=i), data=spline.data, 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,y,10,1,10)

1 Ответ

1 голос
/ 08 ноября 2019

В этой строке выводится фрейм данных из 2 столбцов в виде списка:

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

Предположим, мы воспроизвели ваш код здесь:

df_ <- data.frame(x = c(1,2,3,4,1,2,3,4,1,2,3,4), y = c(0,0,0,0,0,0,0,0,0,0,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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...