Как правильно смоделировать смещение и дисперсию сглаживающего сплайна? - PullRequest
0 голосов
/ 17 декабря 2018

Моя цель - построить разностную декомпозицию кубического сглаживающего сплайна для разных степеней свободы.

Сначала я имитирую тестовый набор (матрица) и набор поездов (матрица).Затем я повторяю более 100 симуляций и изменяю в каждой итерации степени свободы сглаживающего сплайна.

Вывод, полученный с помощью приведенного ниже кода, не показывает компромисса.Что я делаю неправильно при расчете смещения / дисперсии?

Для справки, на правой панели этого рисунка (слайд 14) показан компромисс, который я ожидал ( source )

rm(list = ls())

library(SimDesign)

set.seed(123)

n_sim <- 100
n_df <- 40
n_sample <- 100

mse_temp <- matrix(NA, nrow = n_sim, ncol = n_df)
var_temp <- matrix(NA, nrow = n_sim, ncol = n_df)
bias_temp <- matrix(NA, nrow = n_sim, ncol = n_df)


# Train data -----
x_train <- runif(n_sample, -0.5, 0.5)
f_train <- 0.8*x_train+sin(6*x_train)

epsilon_train <- replicate(n_sim, rnorm(n_sample,0,sqrt(2)))
y_train <- replicate(n_sim,f_train) + epsilon_train

# Test data -----
x_test <- runif(n_sample, -0.5, 0.5)
f_test <- 0.8*x_test+sin(6*x_test)

epsilon_test <- replicate(n_sim, rnorm(n_sample,0,sqrt(2)))
y_test <- replicate(n_sim,f_test) + epsilon_test


for (mc_iter in seq(n_sim)){

  for (df_iter in seq(n_df)){
    cspline <- smooth.spline(x_train, y_train[,mc_iter], df=df_iter+1)

    cspline_predict <- predict(cspline, x_test)

    mse_temp[mc_iter, df_iter] <- mean((y_test[,mc_iter] - cspline_predict$y)^2)
    var_temp[mc_iter, df_iter] <- var(cspline_predict$y)
    # bias_temp[mc_iter, df_iter] <- bias(cspline_predict$y, f_test)^2
    bias_temp[mc_iter, df_iter] <- mean((replicate(n_sample, mean(cspline_predict$y))-f_test)^2)

  }
}

mse_spline <- apply(mse_temp, 2, FUN = mean)
var_spline <- apply(var_temp, 2, FUN = mean)
bias_spline <- apply(bias_temp, 2, FUN = mean)


par(mfrow=c(1,3))
plot(seq(n_df),mse_spline, type = 'l')
plot(seq(n_df),var_spline, type = 'l')
plot(seq(n_df),bias_spline, type = 'l')

1 Ответ

0 голосов
/ 17 декабря 2018

На самом деле я думаю, что ваш код работает, это просто небольшой размер выборки, вы очень быстро попадаете в область переобучения, поэтому все на графике очень близко к левой границе, в области нескольких степеней свободы.Если вы увеличите n_sample, вы увидите ожидаемое соотношение.

...