Интерполяция данных только между первым и последним наблюдением в R - PullRequest
0 голосов
/ 06 февраля 2020

Я немного застрял здесь и мог бы помочь. Я пытаюсь интерполировать некоторые отсутствующие данные во временном ряду, но во многих моих случаях (странах) наблюдений мало, и они часто не согласуются. Поэтому я пытаюсь интерполировать между первым наблюдением и последним в каждой стране. Как мне это сделать, если после последнего наблюдения в стране остались некоторые НС, которые я не хочу интерполировать?

data <- data.frame(country = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3), 
               time = c(1990, 1991, 1992, 1993, 1990, 1991, 1992, 1990, 1991, 1992), 
               value = c(5, 6, 7, NA, 5, NA, 7, 5, 6, 7))
print(data)


data %>% group_by(country) %>% 
 mutate(int = na_interpolation(value))

Я бы хотел, чтобы значение в 1993 году в стране 1 оставалось NA. Это, вероятно, просто, но я не могу обернуть голову вокруг этого.

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Может быть, вы можете попробовать следующий код, используя lm + predict (все NA будут предсказаны)

m <- lm(value ~ time + country, data)
data$value[is.na(data$value)] <- predict(m, newdata = subset(data,!!rowSums(is.na(data))))

таким, что

> data
   country time value
1        1 1990     5
2        1 1991     6
3        1 1992     7
4        1 1993     8
5        2 1990     5
6        2 1991     6
7        2 1992     7
8        3 1990     5
9        3 1991     6
10       3 1992     7

РЕДАКТИРОВАТЬ : Вот базовое решение R, которое сохранит NA на 1993 год в стране 1

data <- do.call(rbind,
                c(lapply(split(data,data$country), 
                         function(v) within(v, value <- approx(time[!is.na(value)],value[!is.na(value)],time)$y)),
                  make.row.names = F)
                )

, такой что

> data 
   country time value
1        1 1990     5
2        1 1991     6
3        1 1992     7
4        1 1993    NA
5        2 1990     5
6        2 1991     6
7        2 1992     7
8        3 1990     5
9        3 1991     6
10       3 1992     7
0 голосов
/ 06 февраля 2020

Попробуйте использовать функцию na.approx в пакете "zoo".

data %>% group_by(country) %>% mutate(int = na.approx(value, na.rm=FALSE))

Надеюсь, что это то, что вы ищете, это сохранит NA в стране 1 как NA.

...