Моделирование образцов из гамма-распределения в R - PullRequest
1 голос
/ 29 марта 2020

У меня проблемы с заданием на программирование.

Из предыдущих вопросов у меня есть list из 49 элементов.

Каждый элемент является sample данными size=10000. Для последнего вопроса мне нужно вычислить среднее значение первых n значений выборки.

  • с n между one и десять тысяч в каждом наборе данных.

Затем я должен построить эти скользящие средние для каждого набора данных.

Я пытался создать списки / векторы скользящих средних, но это не сработало.

Могу ли я что-нибудь сделать?

Ответы [ 2 ]

3 голосов
/ 29 марта 2020

Функция для скользящего среднего:

run_avg <- function(x, n_max){
a <- c(1:n_max)
r_avg <- sapply(a, FUN = function(y) mean(x[1:y]))
return(r_avg) 
}

В вашем случае n_max должно быть равно 10000; Затем эта функция создает для одного набора данных скользящие средние.

Это должно быть применено ко всем наборам данных. Вы можете использовать lapply для этого, если ваши наборы данных хранятся в списке. Другим подходом может быть al oop или что-то в этом роде.

Редактировать: Я вижу, что ваши наборы данных находятся в списке, поэтому просто используйте:

lapply(my_list, run_avg, n_max = 10000)
1 голос
/ 29 марта 2020

Скользящие средние можно вычислить следующим образом:

res <- lapply(x, function(y){
  sapply(seq_along(y), function(k) mean(y[1:k]))
})

Затем, чтобы получить результирующий список в формате, более удобном для построения с пакетом ggplot2, сначала отформатируйте его как кадр данных, с именами строк в виде столбца.

df_res <- do.call(cbind.data.frame, res)
names(df_res) <- paste("Mean", seq_len(ncol(df_res)), sep = ".")
df_res <- cbind(df_res, id = as.integer(row.names(df_res)))

Теперь измените форму с широкого на длинный и нанесите на график.

library(tidyverse)

df_res %>%
  pivot_longer(
    cols = starts_with("Mean"),
    names_to = "Vector",
    values_to = "Mean"
  ) %>%
  ggplot(aes(id, Mean, colour = Vector)) +
  geom_point() +
  geom_line()

enter image description here

Данные испытаний.

set.seed(1234)

list_size <- 4  # 49 in the question
samp_size <- 20 # 10000 in the question

x <- lapply(seq.int(list_size), function(i) rgamma(samp_size, shape = i))
...