Как построить несколько значений ACF на одном графике - PullRequest
0 голосов
/ 05 апреля 2019

Я только начал использовать R и хотел бы посмотреть на автокорреляцию в моих данных с помощью ACF.Мой фрейм данных (GL) выглядит примерно так

GL

well    year    month   value  area
684     1994    Jan     8.53    H
684     1994    Feb     8.62    H
684     1994    Mar     8.12    H
684     1994    Apr     8.21    H
684     1995    Jan     8.53    H
684     1995    Feb     8.62    H
684     1995    Mar     8.12    H
684     1995    Apr     8.21    H
684     1996    Jan     8.53    H
684     1996    Feb     8.62    H
684     1996    Mar     8.12    H
684     1996    Apr     8.21    H
101     1994    Jan     8.53    R
101     1994    Feb     8.62    R
101     1994    Mar     8.12    R
101     1994    Apr     8.21    R
101     1995    Jan     8.53    R
101     1995    Feb     8.62    R
101     1995    Mar     8.12    R
101     1995    Apr     8.21    R
101     1996    Jan     8.53    R
101     1996    Feb     8.62    R
101     1996    Mar     8.12    R
101     1996    Apr     8.21    R

Я бы хотел:1. Рассчитайте ACF для каждой лунки, используя вялую или какую-то петлю (мой фактический набор данных имеет около 100 лунок и три группы)2. Постройте значения ACF (в виде линий) для каждой лунки на одном графике для каждой группы (поэтому в этом случае у меня будет два графика ACF H & R.

Я могу использовать split и lapply для расчета ACF для каждой лунки, например,

split <- split(GL$value,GL$well)
test <- lapply(split,acf)

Но такое разделение не сохраняет информацию о площади.Если я разделю следующим образом:

split1 <- split(GL,GL$well)

Тогда я не знаю, как выполнить laply для значений для каждой лунки.

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Когда вы разделите данные по нулям,

spl1 <- split(GL, GL$well)

lapply будет выглядеть следующим образом.

lapply(spl1, function(x) acf(x$value))

Хотя мы могли бы сделать это несколько лучше.

Когда мы выполняем lapply по номеру списка, мы получаем «счетчик», с помощью которого мы можем получить доступ к именам списка, чтобы вставить вместе информационные заголовки.С помощью par(mfrow=c(<rows>, <columns>)) мы можем установить расположение участков.

par(mfrow=c(1, 2))
lapply(seq_along(spl1), function(x) acf(spl1[[x]]$value, 
                                        main=paste0("well ", names(spl1)[x], ", ", 
                                                    "area ", unique(spl1[[x]]$area))))

Результат

enter image description here

Это, вероятно, придется адаптировать в соответствии с тем, как ваши колодцы разделены на группы.

( В качестве sidenote: Лучше избегать перезаписи имен функций. Вы используете split() и даете результату то же имя, что и функция, которая может вызватьпутаница, как у вас, так и у Р. Другие популярные кандидаты data, df, table. Мы всегда можем быстро проверить с помощью ?, является ли имя "свободным", например, ?df.)


Данные

# result of `dput(GL)`
GL <- structure(list(well = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("101", "684"), class = "factor"), year = structure(c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("1994", "1995", "1996"
), class = "factor"), month = structure(c(3L, 2L, 4L, 1L, 3L, 
2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 
2L, 4L, 1L), .Label = c("Apr", "Feb", "Jan", "Mar"), class = "factor"), 
    value = structure(c(3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 
    1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L), .Label = c("8.12", 
    "8.21", "8.53", "8.62"), class = "factor"), area = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("H", "R"), class = "factor")), row.names = c(NA, 
-24L), class = "data.frame")
0 голосов
/ 05 апреля 2019

Вы можете решить это с помощью data.table:

Давайте начнем с данных (немного измененных по сравнению с вашими, поэтому для каждого well будут разные значения):

structure(list(well = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("101", "684"), class = "factor"), year = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("1994", "1995", "1996"), class = "factor"), month = structure(c(3L, 2L, 4L, 1L, 3L, 
2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L), .Label = c("Apr", "Feb", "Jan", "Mar"), class = "factor"), 
    value = c(4.65144120692275, 8.98342372477055, 17.983893298544, 
    15.3687085728161, 8.9577708535362, 7.47583840973675, 16.6564453896135, 11.6158618542831, 23.6109819535632, 14.1604918171652, 11.3882310683839, 20.4579487598967, 3.31275907787494, 22.109053656226, 13.598402187461,     12.3686389743816, 17.9585587936454, 17.3689122993965, 7.38424337399192, 6.93579732463695, 13.2789171519689, 21.2500206897967, 13.5766511948314, 3.58588649751619), area = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("H", "R"), class = "factor")), row.names = c(NA, -24L), class = c("data.table", "data.frame"))

Затем мы создаем список для каждой well:

GL[, datos := .(list(value)) , by = well]

Каждая строка в переменной datos будет иметь список со всеми значениями, соответствующими well, поэтому мы можем отбросить большинствоих и держите только первый ряд каждого well, так как он уже содержит всю информацию.Это делается с помощью GL[, .SD[1,], by = well], поэтому результатом будет таблица данных из двух строк.После этого мы можем связать другое выражение, которое будет создавать и сохранять каждый график:

GL[, .SD[1,], by = well][
        , {png(filename = paste0(well, "-", area, ".png"), 
               width = 1600, 
               height = 1600, 
               units = "px", 
               res = 100); 
           plot(a[[1]], main = paste("Well:", well, 
                                     "Area:", area, sep = " "));
           dev.off()}, 
         by = well]

Ваши два графика будут сохранены в текущем каталоге с именами, такими как "684-H.png" и "101-R.png ".

Ключевой момент здесь: data.table принимает выражений , а не только функции, поэтому абсолютно возможно создавать графики и сохранять их в любом заданном месте.

...