Меня интересует общая проблема поиска корней для функции интерполяции.
Предположим, у меня есть следующие данные (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
, выполнить интерполяцию для (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
Firstколичество корней неверно.Мы видим два корня из рисунка (слева), но код возвращает только один.Во-вторых, это не правильный корень, так как
f1(fake_root)
#[1] 2.906103
не равен 2,85.
Моя первая попытка решить эту общую проблему: Как оценить значение x по yввод значения после прибл. () в R .Решение оказывается устойчивым для линейной интерполяции, но не обязательно устойчивым для нелинейной интерполяции.Сейчас я ищу стабильное решение, особенно для кубического сплайн-сплайна.
Как решение может быть полезным на практике?
Иногда после одномерного линейная регрессия y ~ x
или одномерный нелинейная регрессия y ~ f(x)
, для которой мы хотим выполнить обратное решение x
для цели y
.Эти вопросы и ответы являются примером и привлекли много ответов: Решите наиболее подходящие полиномиальные линии и выпадающие линии графика , но ни одна из них не является действительно адаптивной или простой в использовании на практике.
- Принятый ответ с использованием
polyroot
работает только для простой полиномиальной регрессии; - Ответы с использованием квадратичной формулы для аналитического решения работают только для квадратичного полинома;
- Мой ответ с использованием
predict
иuniroot
работает в целом, но не удобно, так как на практике использование uniroot
требует взаимодействия с пользователями (подробнее см. Решение Uniroot в R для uniroot
).
Было бы очень хорошо, если бы существовало адаптивное и простое в использовании решение.