如何在R中循环生成分单元重置累积和的面板数据并做ADF检验
解决R语言面板数据集分个体重置累积和的问题
你的核心问题是没有按个体分组重置累积和计算,原代码中cumsum(rnorm(n_entities * n_years))是对所有50个观测值做全局累积和,导致每个个体的序列是前一个个体的延续,而非独立的随机游走过程。
修正后的代码
library(tseries) set.seed(123) result <- numeric(1000) # 预先分配内存,比动态扩展NULL更高效 for (i in 1:1000) { n_entities <- 5 n_years <- 10 # 生成id和年份序列 id <- rep(1:n_entities, each = n_years) year <- rep(2000:2009, times = n_entities) # 关键:为每个个体单独生成累积和,再合并成向量 value <- unlist(lapply(1:n_entities, function(x) { # 每个个体独立生成10个正态随机数,再计算累积和 cumsum(rnorm(n_years)) })) data <- data.frame(id = id, Year = year, Value = value) # 存储ADF检验统计量 result[i] <- adf.test(data$Value)$statistic }
关键逻辑说明
lapply(1:n_entities, ...):遍历每个个体,为每个个体独立生成n_years个正态随机数后单独计算累积和,确保每个个体的序列从新的随机起点开始,完全独立于其他个体unlist():将每个个体的累积和列表转换为一维向量,与id的顺序完全匹配(id按个体重复10次,lapply生成的结果也按个体顺序排列)- 用
numeric(1000)预先分配结果向量,避免循环中频繁扩展向量,提升1000次循环的运行效率
可选:用tidyverse简化分组生成
如果你习惯用tidyverse工具链,可以用dplyr的分组操作更直观实现:
library(tseries) library(dplyr) set.seed(123) result <- numeric(1000) for (i in 1:1000) { data <- expand.grid(id = 1:5, Year = 2000:2009) %>% arrange(id, Year) %>% group_by(id) %>% mutate(Value = cumsum(rnorm(n()))) %>% ungroup() result[i] <- adf.test(data$Value)$statistic }
内容的提问来源于stack exchange,提问作者bbkl
相关产品推荐
相关产品推荐

