Интерполяция значений между тремя точками в R - PullRequest
0 голосов
/ 19 июня 2020

У меня есть набор данных, в котором у меня есть наблюдения за три года (например, 2000, 2005 и 2010), и мне нужно интерполировать значения за годы между ними, используя R. Я попытался использовать какой-то тип сплайна, чтобы сделать однако при этом интерполированные значения выходят за пределы исходного диапазона. В приведенном ниже случае они даже становятся отрицательными.

years <- c(2000, 2005, 2010)
outcome_values <- c(1, 10, 90)
plot(spline(years, outcome_values, xout = seq(min(years), max(years))))
points(years, outcome_values, pch = 16)

plot output

Кто-то описал эту ситуацию и решение в Python с использованием сплайна более низкого порядка ( Гладкая изогнутая линия между 3 точками на графике и интерполировать кривую между тремя значениями ), но я не смог понять, как это сделать в R. Любые указатели будут оценены.

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Вот как это сделать с логическим преобразованием результата. Это гарантирует, что интерполированные значения будут положительными и изменят форму кривой так, как вам нравится.

years = c(2000, 2005, 2010)
outcome_values= c(1, 10, 90)

sp = spline(years, log(outcome_values), xout = seq(min(years), max(years), length.out = 10))
plot(sp$x, exp(sp$y))
points(years, outcome_values, pch = 16)

enter image description here

0 голосов
/ 19 июня 2020

Вы можете уменьшить степень сплайна, но это не решит вашу проблему. Природа ваших данных вызывает отрицательные оценки:

library(splines)

years <- c(2000, 2005, 2010)
outcome_values <- c(1, 10, 90)

# quadratic B-basis spline
fit2 <- lm(outcome_values ~ bs(years, degree = 2))

plot(years, outcome_values, pch = 16)
lines(2000:2010, predict(fit2, data.frame(years = 2000:2010)), col = "blue")

То, что сплайн приводит к отрицательным предсказаниям, не означает, что с этим сплайном что-то не так. Вы должны использовать линейную интерполяцию.

...