чтобы найти решение.
интересует общая проблема поиска корней для интерполяционной функции.
Предположим, у меня есть следующее(x, y)
данные:
set.seed(0)
x <- 1:10 + runif(10, -0.1, 0.1)
y <- rnorm(10, 3, 1)
а также линейная интерполяция и интерполяция кубического сплайна:
f1 <- approxfun(x, y)
f3 <- splinefun(x, y, method = "fmm")
Как я могу найтиx
-значения, когда эти интерполяционные функции пересекают горизонтальную линиюy = y0
? Ниже приведена графическая иллюстрация сy0 = 2.85
.
par(mfrow = c(1, 2))
curve(f1, from = x[1], to = x[10]); abline(h = 2.85, lty = 2)
curve(f3, from = x[1], to = x[10]); abline(h = 2.85, lty = 2)
Мне известно о нескольких предыдущих темах на эту тему, например,
предсказать значения х из простого подбора и аннотировать его на графикеПредсказать значение X из значения Y с помощью подобранной моделиПредполагается, что мы просто поменятьx
а такжеy
, сделай интерполяцию для(y, x)
и вычислить интерполированное значение вy = y0
.
Тем не менее, это ложная идея. Позволятьy = f(x)
быть функцией интерполяции для(x, y)
эта идея верна только тогда, когдаf(x)
является монотонной функциейx
так чтоf
является обратимым В противном случаеx
не является функциейy
и интерполировать(y, x)
без разницы.
Принимая линейную интерполяцию с данными моего примера, эта ложная идея дает
fake_root <- approx(y, x, 2.85)[[2]]
# [1] 6.565559
Прежде всего, количество корней неверно. Мы видим два корня из рисунка (слева), но код возвращает только один. Во-вторых, это не правильный корень, так как
f1(fake_root)
#[1] 2.906103
не 2,85.
Я сделал свою первую попытку по этой общей проблеме вКак оценить значение x из значения y, введенного после приближения () в R, Решение оказывается устойчивым для линейной интерполяции, но не обязательно устойчивым для нелинейной интерполяции. Сейчас я ищу стабильное решение, особенно для кубического интерполяционного сплайна.
Как решение может быть полезным на практике?Иногда послеодномерный линейная регрессияy ~ x
илиодномерный нелинейная регрессияy ~ f(x)
мы хотим отступитьx
для целиy
, Этот Q & A является примером и привлек много ответов:Решите наиболее подходящие полиномиальные и построите выпадающие линии, но ни один из них не является действительно адаптивным или простым в использовании на практике.
polyroot
работает только для простой полиномиальной регрессии;Ответы, использующие квадратичную формулу для аналитического решения, работают только для квадратичного полинома;Мой ответ с помощьюpredict
а такжеuniroot
работает в общем, но не удобно, так как на практике используюuniroot
необходимо взаимодействие с пользователями (см.Uniroot решение в R больше наuniroot
).Было бы очень хорошо, если бы существовало адаптивное и простое в использовании решение.