Интерполяция данных: как мне интерполировать данные в одном наборе данных по разным группам и применять их к другому набору данных с теми же группами? - PullRequest
0 голосов
/ 23 января 2019

У меня есть два набора данных: во-первых, данные о влажности: организованы по дате / месту / обработке / дереву и содержат процент (процент влажности)

У меня также есть другой набор данных (SCD), содержащий дату /сайт / лечение / дерево, а затем имеет коллекционные массы.Во-первых, даты не совпадают (по дням).На каждую обработку приходится 8 деревьев и две обработки

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

Я хочу регрессировать дату по влаге для каждого конкретного участка / обработки / дерева, а затем скормить даты из данных сбора образцов для получения процента влажности.

Отрезок данных по влажности:

structure(list(date = structure(c(17681, 17681, 
17681, 17681, 
17681, 17681, 17681, 17681, 17681, 17681, 17681, 
17681, 17681, 
17681, 17681, 17681, 17681, 17681, 17681, 17681, 
17681, 17681, 
17681, 17681, 17681, 17681, 17681, 17681, 17681, 
17681, 17681, 
17681, 17681, 17685, 17685, 17685, 17685, 17685, 
17685, 17685, 
17685, 17685, 17685, 17685, 17685, 17685, 17685, 
17685, 17685, 
17685), class = "Date"), site = structure(c(2L, 4L, 
2L, 4L, 6L, 
2L, 4L, 4L, 2L, 4L, 4L, 6L, 4L, 6L, 4L, 6L, 4L, 6L, 
4L, 2L, 4L, 
6L, 4L, 6L, 4L, 6L, 4L, 6L, 4L, 6L, 2L, 4L, 6L, 2L, 
4L, 2L, 4L, 
6L, 2L, 4L, 2L, 4L, 2L, 4L, 4L, 6L, 2L, 4L, 6L, 4L), 
.Label = c("hydric", 
"Hydric", "mesic", "Mesic", "xeric", "Xeric"), class 
= "factor"), 
trt = structure(c(1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 
1L, 
2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 
2L, 1L, 
1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 
1L, 1L, 
2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L), .Label = 
c("c", 
"s"), class = "factor"), tree = c(1L, 1L, 1L, 1L, 1L, 
2L, 
2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 
6L, 6L, 
6L, 6L, 6L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 1L, 
1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 
4L), 
percent = c(55.19, 54.22, 56.8, 42.05, 45, 67.53, 50, 
41.85, 
58.39, 51.76, 38.2, 43.6, 60.27, 32.25, 42.1, 49.25, 
47.85, 
25.25, 53.1, 44.25, 46.15, 42.65, 52.18, 40.4, 37.8, 
47, 
44.25, 43.75, 31.8, 37.05, 47, 62.34, 48.55, 64.86, 
44.45, 
61.9, 47.1, 47.25, 68.05, 46.77, 59.93, 33.5, 68.11, 
52.61, 
41.05, 44.2, 63.76, 58.42, 34.8, 62.92), year = 
c(2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 
2018L, 2018L, 2018L, 2018L)), .Names = c("date", 
"site", 
"trt", "tree", "percent", "year"), row.names = c(NA, 
50L), class = "data.frame")

Данные для сбора образцов:

structure(list(Date = structure(c(2L, 2L, 2L, 2L, 2L, 
2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 
3L), .Label = c("43333", "5/31/2018", "6/1/2018", 
"6/10/2018", 
"6/11/2018", "6/14/2018", "6/15/2018", "6/16/2018", 
"6/2/2018", 
"6/20/2018", "6/21/2018", "6/24/2018", "6/25/2018", 
"6/26/2018", 
"6/27/2018", "6/28/2018", "6/29/2018", "6/9/2018", 
"7/14/2018", 
"7/15/2018", "7/16/2018", "7/20/2018", "7/21/2018", 
"7/23/2018", 
"7/24/2018", "7/25/2018", "7/28/2018", "7/29/2018", 
"7/30/2018", 
"7/6/2018", "7/7/2018", "7/9/2018", "8/11/2018", 
"8/12/2018", 
"8/16/2018", "8/17/2018", "8/18/2018", "8/2/2018", 
"8/20/2018", 
"8/21/2018", "8/22/2018", "8/24/2018", "8/26/2018", 
"8/27/2018", 
"8/3/2018", "8/4/2018", "8/9/2018"), class = 
"factor"), Site = structure(c(2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Hydric", 
"Mesic", "Xeric"
), class = "factor"), treatment = structure(c(5L, 5L, 
5L, 5L, 
5L, 5L, 5L, 5L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 5L, 
5L, 5L, 5L, 
5L, 5L, 5L, 5L), .Label = c("Ancillary", "Control", 
"Fertalized", 
"Lysim", "Snowfence"), class = "factor"), Plot = 
c(1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L), Fill = structure(c(3L, 7L, 7L, 
3L, 5L, 5L, 
5L, 4L, 5L, 5L, 3L, 5L, 5L, 5L, 4L, 7L, 3L, 7L, 7L, 
4L, 5L, 4L, 
7L, 5L), .Label = c("", "Broken", "D", "F", "M", 
"reinstall", 
"S", "Sp", "SP", "VF"), class = "factor"), Mass = 
c(12.2, 7.2, 
12, 8.1, 11.4, 8.3, 12.5, 12.8, 12.6, 12.9, 7.4, 
12.6, 12.8, 
9.8, 12.8, 9.3, 8, 9.8, 11.6, 12.8, 10.4, 13.1, 10.6, 
12.9)), .Names = c("Date", 
"Site", "treatment", "Plot", "Fill", "Mass"), 
row.names = c(14L, 
15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 
25L, 26L, 27L, 
28L, 29L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L), 
class = "data.frame")

Moisture$date<-as.Date(Moisture$date, 
format="%m/%d/%Y")
SCD$Date<-as.Date(SCD$Date, format="%m/%d/%Y")

Таким образом, цель - получить данные о проценте влажности, которые совпадают с набором данных SCD для дальнейшего анализа.Я хочу сделать регрессию для каждого отдельного дерева и ввести даты / дерево / сайт SCD, а также вернуть процент и добавить его в виде столбца в SCD.

Я знаю, что это далеко не правильно, но это моя нынешняя попытка.

library(dplyr)
MoistForSCD <- Moisture %>% 
group_by(site,trt,tree) %>% 
arrange(date,tree,site,trt) %>% 
mutate(Loess = predict(loess(percent ~ date, span = 
.5, data=.),SCD))
SCD$M<-MoistForSCD

1 Ответ

0 голосов
/ 24 января 2019

Вы можете сделать это так:

library(tidyverse)
library(lubridate)

Moisture %>%
  mutate(set = 'train') %>%
  select(-year) %>%
  bind_rows(
    SCD %>%
      select(Date, Site, treatment, Plot, Mass) %>%
      rename_at(1:4, ~colnames(Moisture)[1:4]) %>%
      mutate(
        trt = trt %>% str_sub(1, 1) %>% str_to_lower(),
        set = 'test'
      )
  ) %>%
  mutate(month = date %>% month()) %>%
  group_by(tree) %>%
  nest() %>%
  mutate(
    train = map(data, ~filter(.x, set == 'train')),
    test = map(data, ~filter(.x, set == 'test') %>% select(-percent)),
    model = map(train, ~lm(percent ~ date + trt, data = .x)),
    pred = map2(model, test, ~predict(.x, newdata = .y))
  ) %>%
  select(test, pred, tree) %>%
  unnest() %>%
  select(-set)

Если у вас есть больше данных, вы также можете включить site переменную в формулу:

percent ~ date + site + trt

...