Есть ли способ сделать линейную интерполяцию на основе нескольких переменных? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть фрейм данных с несколькими переменными и большим количеством Na *

Experiment <- c("A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C")
Station  <- c(1, 1, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 2, 3)
Depth <- c(5, 20, 7, 50, 6, 20, 40, 100, 15, 20, 78, 92, 15, 56, 87, 10, 60, 80, 150, 10, 15, 35, 7, 25, 5)
ConcA <- c(0.2, 0.3, 0.1, 0.2, 0.1, 0.3, 0.4, NA, 0.2, 0.4, 0.3, 0.2, 0.3, 0.1, 0.1, 0.2, 0.5, 0.4, 0.4, NA, 0.15, NA, 0.4, 0.4, 0.1)
ConcB <- c(NA, 0.2, 0.4, 0.1, 0.1, 0.2, 0.4, 0.3, 0.1, 0.2, 0.3, 0.1, 0.1, 0.2, 0.2, 0.1, 0.3, 0.4, 0.3, 0.2, 0.3, 0.2, 0.4, 0.4, NA)

df <- data.frame(Experiment, Station, Depth, ConcA, ConcB)

Эти эксперименты проводились по всему миру в разных местах, и набор данных на самом деле огромен. Это просто подмножество данных. Как вы можете видеть, глубины образцов не одинаковы для разных станций и экспериментов, и есть много Na в данных о концентрации (ConcA и ConcB)

Я пытаюсь установить глубину до верхних 50 м. и интерполировать данные для каждой глубины 1 м, для каждого эксперимента на основе станции (то есть, чтобы я получал один профиль на станцию ​​с интервалами 1 м для каждого эксперимента).

df <- subset(df, Depth < 50) #this works

df$interp <- NA
df$interp <- approx(df$ConcA, method="linear", n = 50)#this outputs data that is incorrect

df %>%                #this works!
group_by(Experiment) %>%
mutate(interp_ConcA = na.approx(ConcA, na.rm=FALSE))    

Это работало для интерполяции данных, но как я могу «создать» интервалы глубины 1 метр до 50 метров и интерполировать ConcA для каждой глубины 1 метр (вместо только наблюдений на глубине 5, 20,7 и т. Д.)Поскольку вся выборка была сделана в разных местах на разных глубинах, я хочу сопоставить ConcA и ConcB, чтобы оба имели данные глубиной 1 метр ...

Затем объедините данные, чтобы получить среднее значение с интервалами 10 м.

Я пробовал это, но я просто получил много NA

concA.mean <- df %>%
group_by(Experiment, Station, Depth = floor(Depth/10)*10) %>%
dplyr::summarize(interp_ConcA=mean(ConcA, na.rm = TRUE ))
concA.mean 

concB.mean <- df %>%
group_by(Experiment, Station, Depth = floor(Depth/10)*10) %>%
dplyr::summarize(interp_ConcB=mean(ConcB, na.rm = TRUE ))
concB.mean 

В конце концов, я хочу построить отдельные профили данных (то есть фактические собранные данные концентрации для каждой станции в каждом эксперименте)затем добавьте к нему среднюю линию, чтобы показать средний профиль по всему земному шару

(profile <- ggplot(data=df, aes(x=ConcA, y=Depth, group=Station)) + 
geom_path(colour="grey80", size=0.3) +
geom_path(aes(x= interp_ConcA, y=Depth),inherit.aes=FALSE,colour="black",data=ConcA.mean,lwd=0.6)+
#facet_wrap(~Experiment,  scales = "free_y") + scale_y_reverse() +
scale_y_reverse(breaks= seq(0, 50,by=10)) + 
theme_bw() + scale_x_continuous(position = "top") +
ylab(""))

Что я делаю, что неправильно?

Я только что попытался следовать
Линейная интерполяция с использованием dplyr и R: интерполяция NA по группам и адаптация к моему коду:

Спасибо!

...