гладкий.spline (): установленная модель не соответствует заданной пользователем степени свободы
Вот код, который я запустил
fun <- function(x) {1 + 3*sin(4*pi*x-pi)}
set.seed(1)
num.samples <- 1000
x <- runif(num.samples)
y <- fun(x) + rnorm(num.samples) * 1.5
fit <- smooth.spline(x, y, all.knots=TRUE, df=3)
Несмотря на df=3
, Когда я проверил подходящую модель, выход был
Call:
smooth.spline(x = x, y = y, df = 3, all.knots = TRUE)
Smoothing Parameter spar= 1.499954 lambda= 0.002508571 (26 iterations)
Equivalent Degrees of Freedom (Df): 9.86422
Не мог бы кто-нибудь помочь? Спасибо!
1 ответ:
. отметим, что из Р-3.4.0 (2017-04-21),
smooth.spline
можете принять прямое указаниеλ
недавно добавил аргументlambda
. Но он все равно будет преобразован во внутреннийspar
во время оценки. Таким образом, следующий ответ не влияет.
Параметр сглаживания
Гладкость контролируется параметром сглаживанияλ
/spar
лежит в центре управления гладкостьюλ
.smooth.spline()
использует внутренний параметр сглаживанияspar
, а неλ
:Такое логарифмическое преобразование необходимо для того, чтобы сделать неограниченную минимизацию, как GCV/CV. Пользователь может указатьspar = s0 + 0.0601 * log(λ)
spar
, чтобы косвенно указатьλ
. Когдаspar
растет линейно,λ
будет расти экспоненциально. Таким образом, редко возникает необходимость в использовании большого значенияspar
.Степень свободы
df
, также определяется в терминахλ
:Где
X
- матрица модели с базисом B-сплайна иS
- Штраф матрица.Вы можете проверить их отношения с вашим набором данных:
spar <- seq(1, 2.5, by = 0.1) a <- sapply(spar, function (spar_i) unlist(smooth.spline(x, y, all.knots=TRUE, spar = spar_i)[c("df","lambda")]))
Давайте набросаем
df ~ spar
,λ ~ spar
иlog(λ) ~ spar
:Обратите внимание на радикальный ростpar(mfrow = c(1,3)) plot(spar, a[1, ], type = "b", main = "df ~ spar", xlab = "spar", ylab = "df") plot(spar, a[2, ], type = "b", main = "lambda ~ spar", xlab = "spar", ylab = "lambda") plot(spar, log(a[2,]), type = "b", main = "log(lambda) ~ spar", xlab = "spar", ylab = "log(lambda)")
λ
сspar
, линейную связь междуlog(λ)
иspar
и относительно гладкую связь междуdf
иspar
.
smooth.spline()
подходящие итерации дляspar
Если мы вручную зададим значение
spar
, как то, что мы сделали вsapply()
нет подходящих итераций для выбораspar
; в противном случаеsmooth.spline()
необходимо перебрать ряд значенийspar
. Если мы
- укажите
cv = TRUE / FALSE
, подгонка итераций направлена на минимизацию CV / GCV Баллов;- укажите
df = mydf
, подгонка итераций направлена на минимизацию(df(spar) - mydf) ^ 2
.За минимизацией GCV легко следить. Мы не заботимся о счете GCV, но заботимся о соответствующем
spar
. Напротив, при минимизации(df(spar) - mydf)^2
мы часто заботимся оdf
значение в конце итерации, а неspar
! Но принимая во внимание, что это проблема минимизации, мы никогда не гарантируем, что конечноеdf
соответствует нашему целевому значениюmydf
.
Почему вы ставите
df = 3
, но получаетеdf = 9.864?
Окончание итерации может означать либо достижение минимума, либо достижение границы поиска, либо достижение максимального числа итераций.
Мы далеки от максимального предела итераций (по умолчанию 500); тем не менее мы не попали в минимальный. Ну, мы могли бы достичь границы.
Не сосредотачивайтесь наdf
, думайте оspar
.smooth.spline(x, y, all.knots=TRUE, df=3)$spar # 1.4999
В соответствии с
?smooth.spline
, по умолчанию,smooth.spline()
ищетspar
между[-1.5, 1.5]
. То есть, когда вы ставитеdf = 3
, минимизация заканчивается на границе поиска, а не наdf = 3
.Еще раз взгляните на наш график отношения между
df
иspar
. Из рисунка видно, что нам нужно некоторое значениеspar
около 2, чтобы привести к [50]}.Воспользуемся аргументом
control.spar
:Теперь вы видите, что вы заканчиваете сfit <- smooth.spline(x, y, all.knots=TRUE, df=3, control.spar = list(high = 2.5)) # Smoothing Parameter spar= 1.859066 lambda= 0.9855336 (14 iterations) # Equivalent Degrees of Freedom (Df): 3.000305
df = 3
. И нам нуженspar = 1.86
.
Лучшее предложение: не используйте
all.knots = TRUE
Посмотрите, у вас есть 1000 данных. С помощью
Попробуйте вместо этого использовать сплайн штрафной регрессии. Подавление 200 параметры до 3 определенно намного проще:all.knots = TRUE
вы будете использовать 1000 параметров. Желание закончить сdf = 3
подразумевает, что 997 из 1000 параметров подавляются. Представьте, какой большой aλ
следовательноspar
вам нужен!Теперь вы заканчиваете сfit <- smooth.spline(x, y, nknots = 200, df=3) ## using 200 knots # Smoothing Parameter spar= 1.317883 lambda= 0.9853648 (16 iterations) # Equivalent Degrees of Freedom (Df): 3.000386
df = 3
Безspar
контроля.