гладкий.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.000305df = 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.000386df = 3Безsparконтроля.

