在 R 中重采样横截面时间序列数据
Resampling cross-sectional time series data in R
我正在处理横截面时间序列数据(随着时间的推移许多不同的个体)。在个人层面,每个人都有一定数量的商品需求。该数据在每个时期的个体数量方面是不平衡的。对于每个时间段,我都将各个数据汇总到一个时间序列中。下面的示例数据结构
横截面时间序列
Time | Person | Quantity
----------------------
11/18| Bob | 2
11/18| Sally | 1
11/18| Jake | 5
12/18| Jim | 2
12/18| Roger | 8
时间序列
Time | Total Q
-------------
11/18| 8
12/18| 10
我想为每个时期做的是重新抽样(替换)个体数量,对个体进行汇总,迭代 X 次,然后从 bootstrap 中获得均值和标准误差。
最终结果应该类似于
Time | Total Q | Boot Strap Total Mean
-------------------------------------
11/18| 8 | 8.5
12/18| 10 | 10.05
以下是创建示例数据的一些代码:
library(tidyverse)
set.seed(1234)
Cross_Time = data.frame(x) %>%
mutate(Period = sample(1:10, 50, replace=T),
Q=rnorm(50,10,1)) %>%
arrange(Period)
Timeseries = Cross_Time %>%
group_by(Period) %>%
summarize(Total=sum(Q))
我知道这在 R 中是可行的,但我不知道如何编写代码或我需要问的正确问题是什么。感谢所有帮助!
我们可能会做以下事情:
X <- 1000
Cross_Time %>% group_by(Period) %>%
do({QS <- colSums(replicate(sample(.$Q, replace = TRUE), n = X))
data.frame(Period = .$Period[1], `Total Q` = sum(.$Q), Mean = mean(QS), `Standard Error` = sd(QS))})
# A tibble: 10 x 4
# Groups: Period [10]
# Period Total.Q Mean Standard.Error
# <int> <dbl> <dbl> <dbl>
# 1 1 28.8 28.8 0.284
# 2 2 35.9 35.8 0.874
# 3 3 109. 109. 3.90
# 4 4 48.9 48.9 2.16
# 5 5 20.2 20.2 0.658
# 6 6 59.0 58.8 3.57
# 7 7 88.7 88.6 2.64
# 8 8 22.7 22.7 1.04
# 9 9 47.7 47.7 2.46
# 10 10 27.9 27.9 0.575
我认为代码是不言自明的。在每个组中,我们用 replicate
替换 X
次对它的值进行重新采样,并计算两个所需的统计数据。添加任何其他内容也很简单!
我正在处理横截面时间序列数据(随着时间的推移许多不同的个体)。在个人层面,每个人都有一定数量的商品需求。该数据在每个时期的个体数量方面是不平衡的。对于每个时间段,我都将各个数据汇总到一个时间序列中。下面的示例数据结构
横截面时间序列
Time | Person | Quantity
----------------------
11/18| Bob | 2
11/18| Sally | 1
11/18| Jake | 5
12/18| Jim | 2
12/18| Roger | 8
时间序列
Time | Total Q
-------------
11/18| 8
12/18| 10
我想为每个时期做的是重新抽样(替换)个体数量,对个体进行汇总,迭代 X 次,然后从 bootstrap 中获得均值和标准误差。
最终结果应该类似于
Time | Total Q | Boot Strap Total Mean
-------------------------------------
11/18| 8 | 8.5
12/18| 10 | 10.05
以下是创建示例数据的一些代码:
library(tidyverse)
set.seed(1234)
Cross_Time = data.frame(x) %>%
mutate(Period = sample(1:10, 50, replace=T),
Q=rnorm(50,10,1)) %>%
arrange(Period)
Timeseries = Cross_Time %>%
group_by(Period) %>%
summarize(Total=sum(Q))
我知道这在 R 中是可行的,但我不知道如何编写代码或我需要问的正确问题是什么。感谢所有帮助!
我们可能会做以下事情:
X <- 1000
Cross_Time %>% group_by(Period) %>%
do({QS <- colSums(replicate(sample(.$Q, replace = TRUE), n = X))
data.frame(Period = .$Period[1], `Total Q` = sum(.$Q), Mean = mean(QS), `Standard Error` = sd(QS))})
# A tibble: 10 x 4
# Groups: Period [10]
# Period Total.Q Mean Standard.Error
# <int> <dbl> <dbl> <dbl>
# 1 1 28.8 28.8 0.284
# 2 2 35.9 35.8 0.874
# 3 3 109. 109. 3.90
# 4 4 48.9 48.9 2.16
# 5 5 20.2 20.2 0.658
# 6 6 59.0 58.8 3.57
# 7 7 88.7 88.6 2.64
# 8 8 22.7 22.7 1.04
# 9 9 47.7 47.7 2.46
# 10 10 27.9 27.9 0.575
我认为代码是不言自明的。在每个组中,我们用 replicate
替换 X
次对它的值进行重新采样,并计算两个所需的统计数据。添加任何其他内容也很简单!