R语言循环代码报错排查及6处错误定位与变量清理求助
修复R代码中的错误并解决报错问题
让我们一步步梳理你的代码问题,解决现存报错并找出剩余的3处错误,同时清理rm语句中的不必要变量:
已发现报错的原因及修复
你遇到的Error in err[(t - 1):(p - q)] : only 0's may be mixed with negative subscripts,核心问题是索引逻辑完全错误:
alpha是长度为q的向量,对应q个滞后的误差项,原本应该取err中t-1到t-q的位置,而不是(t-1):(p-q)——如果p<q,p-q会变成负数,直接导致索引非法。正确写法是err[(t - q):(t - 1)]。
剩余3处错误的定位与修复
- 变量名大小写不匹配:代码里写的
Err[t]用了大写E,但你定义的误差变量是小写的err,这会导致R找不到变量,需要改为err[t]。 - Y的索引语法错误:你修正后的
Y = y[(n + 1)(2*n)]缺少了切片必需的冒号,R会把(n+1)(2n)当成乘法运算,完全不符合取数逻辑,正确写法是Y = y[(n + 1):(2*n)]。 - 滞后项运算维度不匹配:
beta %*% y[(t - 1):(t - p)]中,beta是长度为p的列向量,y[(t-1):(t-p)]也是列向量,两者用%*%会得到一个p×p的矩阵,而不是我们需要的标量。可以改用元素相乘后求和sum(beta * y[(t - 1):(t - p)]),或者转置beta为行向量t(beta) %*% y[(t - 1):(t - p)],确保运算结果是标量。
rm语句清理
在rm(list = c("err", "initErr", "initY", "y", "t", "myMatrikel"))中,t是循环临时变量,循环结束后它的生命周期已经完成,且在代码块的局部环境中会自动清理,属于不必要的删除项,所以可以移除t。
修正后的完整代码
myMatrikel = 7081255 { n = 500 set.seed(myMatrikel) p = sample(1:6, 1) q = sample(1:6, 1) alpha = round(runif(q, min = 0, max = 1/q), digits = 3) beta = round(runif(p, min = 0, max = 1/p), digits = 3) initY = rnorm(max(p, q)) initErr = rnorm(max(p, q)) y = err = numeric(2*n) # 替换1:(2*n)*0,更规范的零向量生成方式 y[1:max(p, q)] = initY err[1:max(p, q)] = initErr for (t in (max(p, q) + 1):length(y)) { err[t] = rnorm(1) # 用sum元素相乘替代%*%,避免维度匹配问题 y[t] = sum(beta * y[(t - 1):(t - p)]) + sum(alpha * err[(t - q):(t - 1)]) + err[t] } Y = y[(n + 1):(2*n)] } rm(list = c("err", "initErr", "initY", "y", "myMatrikel"))
额外优化:我把y = err = 1:(2*n)*0改成了y = err = numeric(2*n),这是R中生成指定长度零向量的标准写法,能避免不必要的序列生成操作。
内容的提问来源于stack exchange,提问作者Phiet
相关产品推荐
相关产品推荐

