Как экстраполировать/интерполировать в R

Я пытаюсь интерполировать/экстраполировать значения NA. Набор данных, который у меня есть, получен с измерительной станции, которая измеряет температуру почвы на 4 глубинах каждые 5 минут. В этом конкретном примере имеются ошибочные данные (-888,88) в конце измерений для переменной глубины 0 см и переменной глубины 1-5 см. Я преобразовал это в NA. Теперь мой профессор хочет, чтобы я интерполировал/экстраполировал для этого и всех других наборов данных, которые у меня есть. Я знаю, что экстраполяция такого количества значений после последнего наблюдения может быть статистически неточной, но я пытаюсь хотя бы придумать рабочий код. На данный момент я попытался экстраполировать одну из переменных (SoilTemp_1.5cm). Последняя строка работает, но когда я открываю фрейм данных, NA все еще там.

library(dplyr)
library(Hmisc)

MyD <- read.csv("2319538_Bodentemp_braun_WILDKOGEL_17_18 - Copy.csv",header=TRUE, sep=";")

MyD$date <- as.Date(MyD$Date, "%d.%m.%Y")
MyD$datetime <- as.POSIXct(MyD$Date.Time..GMT.01.00, format = "%d.%m.%Y %H:%M")

MyD[,-c(1,2,3,4,9)][MyD[,-c(1,2,3,4,9)] == -888.88] <- NA #convert erroneous data to NA


MyD %>%  mutate(`SoilTemp_1.5cm`=approxExtrap(x=SoilTemp_5cm, y=SoilTemp_1.5cm, xout=SoilTemp_5cm)$y)

Я также пробовал этот способ, который дает мне список из 2, в котором много столбцов вместо строк, когда я конвертирую в фрейм данных. Не буду врать, что этот синтаксис auxExtrap меня немного смущает.

MyD1 <- approxExtrap(MyD$SoilTemp_5cm, MyD$SoilTemp_1.5cm,xout=MyD$SoilTemp_5cm)
MyD1

Честно говоря, я не уверен, как воспроизвести данные, поэтому вот ссылка pastebin вывода dput() https://pastebin.com/NFZdmm4L. Я попытался включить как можно больше вывода. Имейте в виду, что я исключил некоторые столбцы при запуске dput(), поэтому код MyD[,-c(1,2,3,4,9)][MyD[,-c(1,2,3,4,9)] == -888.88] может отличаться. В любом случае, вывод dput() уже включает NA, поэтому он может вам даже не понадобиться.

Заранее спасибо.

С наилучшими пожеланиями,

Зорин


person Zorin Ivanov    schedule 15.06.2020    source источник


Ответы (1)


na.приблизительно заполнит NA интерполированными значениями, а rule=2 расширит первое и последнее значения.

library(zoo)

x <- c(NA, 4, NA, 5, NA) # test input

na.approx(x, rule = 2)
## [1] 4.0 4.0 4.5 5.0 5.0
person G. Grothendieck    schedule 15.06.2020
comment
Я запускаю следующий код, и когда я снова открываю фрейм данных, ничего не происходит. library(zoo) MyD <- read.csv("2319538_Bodentemp_braun_WILDKOGEL_17_18 - Copy.csv",header=TRUE, sep=";") MyD$date <- as.Date(MyD$Date, "%d.%m.%Y") MyD$datetime <- as.POSIXct(MyD$Date.Time..GMT.01.00, format = "%d.%m.%Y %H:%M") MyD[,-c(1,2,3,4,9)][MyD[,-c(1,2,3,4,9)] == -888.88] <- NA na.approx(MyD$SoilTemp_1.5cm, rule=2) Также есть ли способ основывать интерполяцию/экстраполяцию переменной SoilTemp_1.5cm на переменной SoilTemp_5cm? В переменной SoilTemp_5cm отсутствуют отсутствующие NA. - person Zorin Ivanov; 16.06.2020
comment
Прочтите инструкции по размещению в верхней части страницы тегов r. В частности, минимальная версия входных данных, достаточная для иллюстрации вашей проблемы, должна быть предоставлена ​​​​с использованием dput, чтобы она была воспроизводимой. - person G. Grothendieck; 16.06.2020
comment
Но я предоставил ссылку pastebin с выводом dput(). Если вы не видели, пожалуйста, посмотрите мой начальный пост. Если вы видели это и причина, по которой вы пишете это, заключается в том, что вывод dput() слишком велик на ваш вкус, я уменьшу его. Я подумал, что было бы неплохо предоставить как можно больший размер выборки, чтобы результат экстраполяции был как можно ближе к реальному набору данных. - person Zorin Ivanov; 16.06.2020
comment
Вопрос должен быть автономным и сводиться к минимальной форме, чтобы респонденты могли быстро на него ответить. - person G. Grothendieck; 16.06.2020