You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:30:08