Линейная интерполяция в R - PullRequest
15 голосов
/ 17 июля 2011

У меня есть набор данных реальных данных, например, выглядящий следующим образом:

# Dataset 1 with known data
known <- data.frame(
    x = c(0:6),
    y = c(0, 10, 20, 23, 41, 39, 61)
)

plot (known$x, known$y, type="o")

Теперь я хочу получить ответ на вопрос "Каким будет значение Y для 0,3, если все промежуточные точки данныхисходного набора данных, находятся ли на прямой линии между окружающими измеренными значениями? "

 # X values of points to interpolate from known data
 aim <- c(0.3, 0.7, 2.3, 3.3, 4.3, 5.6, 5.9)

Если вы посмотрите на график: я хочу получить Y-значения, где линии пересечения пересекаются с линейной интерполяциейиз известных данных

abline(v = aim, col = "#ff0000")

Итак, в идеальном случае я бы создал «linearInterpolationModel» с моими известными данными, например,

model <- linearInterpol(known)

..., которые я затем могу попроситьзначения Y, например

model$getEstimation(0.3)

(которые в этом случае должны давать «3»)

abline(h = 3, col = "#00ff00")

Как я могу это реализовать?Вручную я бы для каждого значения сделал что-то вроде этого:

  1. Какое ближайшее значение X меньше Xsmall, а ближайшее значение * больше Xlarge, чем текущее значение X X.
  2. Рассчитать относительное положение для меньшего значения X relPos = (X - Xsmall) / (Xlarge - Xsmall)
  3. Рассчитать ожидаемое значение Y Yexp = Ysmall + (relPos * (Ylarge - Ysmall))

Как минимум для программного обеспечения MatlabЯ слышал, что есть встроенная функция для таких проблем.

Спасибо за вашу помощь,

Свен

Ответы [ 2 ]

17 голосов
/ 17 июля 2011

Возможно, вы смотрите на approx() и approxfun() ... или, я полагаю, вы можете использовать lm для линейного или lowess для непараметрического подбора.

11 голосов
/ 17 июля 2011

Чтобы проконтролировать ответ DWin, вот как вы можете получить прогнозируемые значения с помощью линейной модели.

model.lm <- lm(y ~ x, data = known)

# Use predict to estimate the values for aim.
# Note that predict expects a data.frame and the col 
# names need to match
newY <- predict(model.lm, newdata = data.frame(x = aim))

#Add the predicted points to the original plot
points(aim, newY, col = "red")

И, конечно, вы можете напрямую получить эти прогнозные значения:

> cbind(aim, newY)
  aim       newY
1 0.3  2.4500000
2 0.7  6.1928571
3 2.3 21.1642857
....
...