/ / Come interpolare i valori mancanti in una serie temporale, limitata dal numero di NA sequenziali (R)? - r, serie temporali, interpolazione, dati mancanti

Come interpolare valori mancanti in una serie temporale, limitata dal numero di NA sequenziali (R)? - r, serie temporali, interpolazione, dati mancanti

Ho valori mancanti in una serie temporale di date. Per esempio:

set.seed(101)

df <- data.frame(DATE = as.Date(c("2012-01-01", "2012-01-02",
"2012-01-03", "2012-01-05", "2012-01-06", "2012-01-15", "2012-01-18",
"2012-01-19", "2012-01-20", "2012-01-22")),
VALUE = rnorm(10, mean = 5, sd = 2))

Come posso scrivere una funzione che riempirà tuttodate mancanti tra la prima e l'ultima data (es. 2012-01-01 e 2012-01-22 "), quindi utilizzare l'interpolazione (spline lineare e di livellamento) per riempire i valori mancanti, ma non più di 3 valori sequenziali mancanti (ovvero no interpolazione tra il 2012-01-06 e il 2012-01-15)?

La funzione verrà applicata a un formato molto grandedataframe. Sono stato in grado di scrivere una funzione che utilizza l'interpolazione lineare per riempire tutti i valori mancanti tra due date (vedi sotto), ma non riesco a capire come fermare l'interpolazione di lunghi tratti di valori mancanti.

interpolate.V <- function(df){

# sort data by time
df <- df[order(df$DATE),]

# linnearly interpolate VALUE for all missing DATEs
temp <- with(df, data.frame(approx(DATE, VALUE, xout = seq(DATE[1],
DATE[nrow(df)], "day"))))
colnames(temp) <- c("DATE", "VALUE_INTERPOLATED")
temp$ST_ID <- df$ST_ID[1]
out <- merge(df, temp, all = T)
rm(temp)

return(out)
}

Qualsiasi aiuto sarà molto apprezzato!

Grazie

risposte:

1 per risposta № 1

Funzione che aggiunge righe per tutte le date mancanti:

date.range <- function(sub){

sub$DATE <- as.Date(sub$DATE)
DATE <- seq.Date(min(sub$DATE), max(sub$DATE), by="day")
all.dates <- data.frame(DATE)
out <- merge(all.dates, sub, all = T)

return(out)
}

Usa na.approx o na.spline dal pacchetto zoo con argomento maxgap:

interpolate.zoo <- function(df){
df$VALUE_INT <- na.approx(df$VALUE, maxgap = 3, na.rm = F)
return(df)
}