Интерполировать значения NA - PullRequest
13 голосов
/ 25 августа 2011

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

A <- cbind(time=c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100),
           Avalue=c(1, 2, 3, 2, 1, 2, 3, 2, 1, 2))
B <- cbind(time=c(15, 30, 45, 60), Bvalue=c(100, 200, 300, 400))
C <- merge(A,B, all=TRUE)

   time Avalue Bvalue
1    10      1     NA
2    15     NA    100
3    20      2     NA
4    30      3    200
5    40      2     NA
6    45     NA    300
7    50      1     NA
8    60      2    400
9    70      3     NA
10   80      2     NA
11   90      1     NA
12  100      2     NA

Предполагая линейное изменение между каждой выборкой, можно рассчитать недостающие значения NA. Интуитивно легко увидеть, что значение A во время 15 и 45 должно быть 1,5. Но правильный расчет для B например, в момент времени 20 будет

100 + (20 - 15) * (200 - 100) / (30 - 15)

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

Как я могу использовать R для расчета значений NA?

Ответы [ 2 ]

14 голосов
/ 25 августа 2011

Использование пакета zoo:

library(zoo)
Cz <- zoo(C)
index(Cz) <- Cz[,1]
Cz_approx <- na.approx(Cz)
3 голосов
/ 25 августа 2011

Правильный способ сделать это статистически и при этом получить действительные доверительные интервалы - это использовать множественное вменение.См. Классическую книгу Рубина , и для этого есть отличный пакет R (mi) .

...