R中时间序列数据的增长率

时间:2019-12-06 16:41:41

标签: r ggplot2 data.table time-series rate

Net.Mail.SmtpClient.Send()

Body size over time

我的问题是如何实现一个函数来计算数据表中个人在几天内的增长率。这是形态数据,因此生长速度将计算为log(body day(i-1))-log(body day(i-1))。换句话说,(今天的身高)-(昨天的身高)。每个小组有5个人,为期10天。查找每个人每天的增长率是该帖子的目标,并重新创建发布的图表,但表示每天的增长率。随附一些模拟数据。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

好吧,我data.table不好,但这是tidyverse的尝试。

首先,我将重新制作您的数据。

library(tidyverse)

set.seed(100)

# Making data
date <- rep(1:10, each=10)
id <- rep(1:10, 10)
grp <- rep(1:2, each=5)

df <- cbind(date, grp, id) %>% 
  as_tibble %>%
  rowwise %>%
  mutate(bodysize = rnorm(1, mean = 5 + grp)) %>%
  ungroup

我想出一个比pivot_wider更好的解决方案,要逐个进行滞后,然后转回长格式,以便使滞后正常工作。

result <- df %>% 
  pivot_wider(names_from = c(grp, id), 
              values_from = bodysize) %>%
  mutate_at(vars(-date), 
            list(growth = ~. - lag(.))) %>%
  pivot_longer(-date, names_to = c("grp", "id"), 
               names_pattern = "([0-9]+)_([0-9]+)",
               values_to = "growth") %>%
  filter(!is.na(growth))

现在,我不确定您想要的情节是什么。您提到了5个人,但您有10个ID。如果我们分别绘制它们,则绘制会有些混乱,但是您可以使用aes来分隔每行。

# Plot
ggplot(result, 
       aes(x = date, y = growth, group = id)) + 
  geom_line(position = "identity", 
            aes(color = as.factor(grp)), size = 2, linetype = 2) +
  geom_point(size = 2) +
  theme_minimal() + 
  labs(x = "Date", y = "Body size (mm)", color = "Group" )

或者,如果您愿意的话,我们当然可以对每个ID进行平均,以获得更整洁的情节。

# Alternative plot
ggplot(result %>% group_by(date, grp) %>% summarise(grp_mean = mean(growth)), 
       aes(x = date, y = grp_mean, group = grp)) + 
  geom_line(position = "identity", 
            aes(color = as.factor(grp)), size = 2, linetype = 2) +
  geom_point(size = 2) +
  theme_minimal() + 
  labs(x = "Date", y = "Body size (mm)", color = "Group")

reprex package(v0.2.1)于2019-12-06创建

(为更好的尝试而完全编辑。)