r - 使用循环为具有引用其他列的方程的数据框的空列生成数据
问题描述
我正在尝试通过生成起始值然后使用引用其他列的方程式来模拟宽数据框中的面板数据以获取以下“时间点”。对于 n*t = 10500 个总观察值,我想要 n = 500, t = 21。
我从多元正态分布中模拟了一些初始观察结果(即 t = 0),然后生成了一个宽数据框,其中包含接下来 20 个连续“时间点”(即 t > 0)的占位符列。到目前为止,我的数据看起来像这样(仅显示前 15 列):
id xt0 yt0 wt0 zt0 xt1 yt1 xt2 yt2 xt3 yt3 xt4 yt4 xt5 yt5
1 0.1251041 -0.5202968 0.7444884 -0.1655747 -0.4636554 NA NA NA NA NA NA NA NA NA NA
22 -1.4346734 0.2313276 4.4026209 0.6278826 -0.2208187 NA NA NA NA NA NA NA NA NA NA
43 3.5234120 1.6617287 1.8510357 0.3680791 1.3616461 NA NA NA NA NA NA NA NA NA NA
64 1.9857540 1.5927217 -1.7127041 -0.1823246 0.6032245 NA NA NA NA NA NA NA NA NA NA
85 2.0633524 1.8347750 1.5244358 0.5539688 0.5201867 NA NA NA NA NA NA NA NA NA NA
106 2.1106941 -1.1516203 -0.1515743 -0.5320694 0.1345948 NA NA NA NA NA NA NA NA NA NA
我现在想找到一种有效的方法来做到这一点,因为有 20 个时间点和两个变量,像这样写出每个方程会很麻烦:
param <- c( 0.2, 0.5, 1.0)
df$xt1 <- param[ 1]*df$xt0 + param[ 2]*df$yt0 + param[ 3]*df$wt0 + rnorm( 500, 0, 1)
df$yt1 <- param[ 1]*df$yt0 + param[ 2]*df$xt0 + param[ 3]*df$zt0 + rnorm( 500, 0, 1)
df$xt2 <- param[ 1]*df$xt1 + param[ 2]*df$yt1 + param[ 3]*df$wt0 + rnorm( 500, 0, 1)
...
df$yt20 <- param[ 1]*df$yt19 + param[ 2]*df$xt19 + param[ 3]*df$zt0 + rnorm( 500, 0, 1)
注意模式是:系数1*滞后变量+系数2*交叉滞后变量+系数3*常数+随机噪声。
这意味着对于每个方程,自回归列和交叉滞后列都会发生变化,但常数始终来自同一列。这使我无法弄清楚代码变得更加复杂。
到目前为止,我尝试过:
for( i in df[ , 5:ncol( df)]) {
if( lapply( ncol( df[ , i], '%%', 2) == 0)) {
df[ , i] <- param[ 1]*df[ , ( i - 4)] + param[ 2]*df[ , ( i - 3)] + param[ 3]*df$wt0 + rnorm( 500, 0, 1)
} else {
df[ , i] <- param[ 1]*df[ , ( i - 4)] + param[ 2]*df[ , ( i - 3)] + param[ 3]*df$zt0 + rnorm( 500, 0, 1)
}
}
我试图用这段代码做的是:
- 从第 5 列开始循环遍历数据框中的列
- 如果列号是偶数(x 变量,从 #6 开始),则应用第一个等式,如果列号是奇数(y 变量),则应用第二个等式
- 对于循环的每次迭代,在左侧 4 列的列中找到自回归变量,在左侧 3 列的列中找到交叉滞后变量,常数(wt0 和 yt0)总是在同一列中找到(但 x 和 y 不同)。
我收到错误
Error in match.fun(FUN) : argument "FUN" is missing, with no default
但是这段代码只是从我在互联网上其他地方找到的部分拼凑而成的。我确信它存在许多问题。所以我会很感激任何帮助!谢谢!
编辑:这是数据框前 6 行和 15 列的 dput 输出。
structure(list(id = c(-0.409761767417203, -2.16821996677264,
3.26224532017912, 1.99293159129652, 0.18786842037283, -0.403158586535083
), xt0 = c(-1.08325121689622, -0.257402826652493, 4.51801329740704,
2.00766925507723, 2.05915331375632, 0.893125999249676), yt0 = c(0.744488400264831,
4.4026209400443, 1.85103568019496, -1.71270414984045, 1.52443576496701,
-0.151574338169848), wt0 = c(-0.165574724549133, 0.627882638545303,
0.368079129633285, -0.182324586908647, 0.553968819325837, -0.532069428215114
), zt0 = c(-0.463655350080687, -0.220818663029958, 1.36164608113302,
0.603224522813769, 0.520186714928409, 0.134594809514275), xt1 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), yt1 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), xt2 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), yt2 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), xt3 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), yt3 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), xt4 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), yt4 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), xt5 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), yt5 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), row.names = c(1L,
22L, 43L, 64L, 85L, 106L), class = "data.frame")
解决方案
推荐阅读
- python - 计算向量和矩阵之间的距离
- linux - 在busybox上解压缩保留软链接
- node.js - 在容器内连接到 Amazon 的 DynamoDB
- javascript - 如何让 Joi 具有非凡的价值?
- django - 在 django 应用程序中加载静态文件
- multithreading - Mybatis 扫描配置文件耗时较长
- .net - 使用 .resx 和 AngularJs 翻译
- java - 使用 InputSource 将 XML 解析为字符串会给出空文档
- ios - 在 UIcollectionViewCells 上快速绘制线条
- symfony - 如何使用 FOSUserBundle 引用 symfony 4.3 的邮件组件