R语言模拟ARMA(1,0)模型时遇数据框替换错误求助
问题诊断与解决方案
首先,这个错误的核心是数据框维度不匹配:你尝试往一个空的数据框(0行)里插入一列有100行的数据,R自然会报错,因为两者的行数无法对齐。结合你的模拟需求,大概率是你在存储回归结果时的逻辑出了问题——你需要的是每次模拟得到1个系数、1个标准误和1个t统计量,总共1999组这类结果,而不是把模拟出来的时间序列直接塞进结果数据框。
错误场景还原
假设你之前的代码大概是这样的(典型的新手错误):
# 错误示例 results <- data.frame() # 创建空数据框(0行) for (i in 1:1999) { # 模拟两个随机游走序列 e <- rnorm(100) a <- cumsum(e) v <- rnorm(100) b <- cumsum(v) # 回归 model <- lm(a ~ b) # 错误:试图把整个序列a或b赋值给空数据框的列,或错误处理了回归结果 results$c_coef <- coef(model)[2] }
空数据框没有行,当你试图给它加列时,R要求新列的行数必须和数据框现有行数一致(0行),但你要么不小心塞了100行的序列,要么虽然塞了单个值,但空数据框无法直接按列赋值(因为没有行可以对应)。
正确的实现方式
我们需要预先创建一个有1999行的结果数据框,用来存储每次模拟的三个统计量,这样每次循环只需要给对应行赋值即可:
# 设定参数 n <- 100 # 时间序列长度 sim_times <- 1999 # 模拟次数 # 预先创建结果数据框:1999行,3列分别存系数、标准误、t统计量 results <- data.frame( c_hat = numeric(sim_times), se_c = numeric(sim_times), t_stat = numeric(sim_times) ) # 开始模拟循环 for (i in 1:sim_times) { # 模拟误差项(假设是正态分布,你可以根据需求调整) e <- rnorm(n) v <- rnorm(n) # 生成随机游走序列(你的ARMA(1,0)其实是φ=1的AR(1),即随机游走) a <- cumsum(e) # 等价于a[1]=e[1], a[t]=a[t-1]+e[t] b <- cumsum(v) # 执行回归 model <- lm(a ~ b) # 提取回归结果:第二行是b的系数(第一行是截距) coef_info <- summary(model)$coefficients[2, ] # 赋值到结果数据框的第i行 results[i, "c_hat"] <- coef_info[1] # 系数估计值 results[i, "se_c"] <- coef_info[2] # 标准误 results[i, "t_stat"] <- coef_info[3] # t统计量 } # 最后提取所有t统计量 t_stats <- results$t_stat
额外提醒
注意你的两个序列都是随机游走(单位根过程),用lm做回归会出现伪回归问题——即使a和b是完全独立的,t统计量也会大概率显著,这是时间序列分析中的经典陷阱,如果你是在学习伪回归的话当我没说,但如果是想做常规回归,记得先对序列做差分哦。
内容的提问来源于stack exchange,提问作者user9366839
相关产品推荐
相关产品推荐

