我正在尝试根据以下方程模拟 y 观测值:
对于 X 的所有可能值以及参数 Beta 和参数 Delta 的随机值。
使用 R 和 tidyverse 中的包,这就是我到目前为止所得到的:
library(tidyverse)
library(extraDistr)
n <- 100
x_max <- 4
data <-
tibble(
id = 1:n,
beta = rnorm(n, mean = 0, sd = 1/(x_max - 1)),
delta = cbind(0, rdirichlet(n, rep(1, x_max - 1)))
) %>%
expand_grid(x = 1:x_max)
data
# A tibble: 400 × 4
id beta delta[,1] [,2] [,3] [,4] x
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
1 1 0.139 0 0.738 0.206 0.0556 1
2 1 0.139 0 0.738 0.206 0.0556 2
3 1 0.139 0 0.738 0.206 0.0556 3
4 1 0.139 0 0.738 0.206 0.0556 4
5 2 0.174 0 0.0764 0.658 0.266 1
6 2 0.174 0 0.0764 0.658 0.266 2
7 2 0.174 0 0.0764 0.658 0.266 3
8 2 0.174 0 0.0764 0.658 0.266 4
9 3 0.305 0 0.346 0.254 0.399 1
10 3 0.305 0 0.346 0.254 0.399 2
# ℹ 390 more rows
# ℹ Use `print(n = ...)` to see more rows
我陷入了根据上面的公式计算 y 值的部分。挑战是在计算增量参数总和时使用 x 作为索引变量。我正在寻找的是这样的东西:
data %>%
rowwise() %>%
mutate(
y = beta * sum(c_across(delta[,1]:delta[,x]))
)
但是,此代码不起作用,我收到以下错误消息:
Error in `mutate()`:
ℹ In argument: `y = beta * sum(c_across(delta[, 1]:delta[, x]))`.
ℹ In row 1.
Caused by error in `c_across()`:
! Problem while evaluating `delta[, 1]`.
Caused by error:
! object 'delta' not found
我知道嵌套矩阵一定有问题
delta
。不过,我还是觉得dplyr
应该能够支持向量化索引操作不是?
这接近您要找的东西吗?
library(tidyverse)
library(extraDistr)
#>
#> Attaching package: 'extraDistr'
#> The following object is masked from 'package:purrr':
#>
#> rdunif
n <- 100
x_max <- 4
data <-
tibble(
id = 1:n,
beta = rnorm(n, mean = 0, sd = 1/(x_max - 1)),
delta = cbind(0, rdirichlet(n, rep(1, x_max - 1)))
) %>%
expand_grid(x = 1:x_max)
data %>%
rowwise() %>%
mutate(
y = beta * sum(delta[,1:x])
)
#> # A tibble: 400 × 5
#> # Rowwise:
#> id beta delta[,1] [,2] [,3] [,4] x y
#> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl>
#> 1 1 0.223 0 0.752 0.232 0.0163 1 0
#> 2 1 0.223 0 0.752 0.232 0.0163 2 0.168
#> 3 1 0.223 0 0.752 0.232 0.0163 3 0.219
#> 4 1 0.223 0 0.752 0.232 0.0163 4 0.223
#> 5 2 0.233 0 0.651 0.106 0.243 1 0
#> 6 2 0.233 0 0.651 0.106 0.243 2 0.151
#> 7 2 0.233 0 0.651 0.106 0.243 3 0.176
#> 8 2 0.233 0 0.651 0.106 0.243 4 0.233
#> 9 3 -0.0404 0 0.324 0.0280 0.648 1 0
#> 10 3 -0.0404 0 0.324 0.0280 0.648 2 -0.0131
#> # ℹ 390 more rows