在数据集模拟中循环
Loop in a dataset simulation
我希望在 R 中得到以下问题的帮助。
我有以下代码可以根据指数分布生成 30 列数据集:
x0=0
xmax=8000
xout=3000
lambda=0.0002
n=1
x1=x0+rexp(n,lambda)-xout
x2=x1+rexp(n,lambda)-xout
x3=x2+rexp(n,lambda)-xout
x4=x3+rexp(n,lambda)-xout
x5=x4+rexp(n,lambda)-xout
x6=x5+rexp(n,lambda)-xout
x7=x6+rexp(n,lambda)-xout
x8=x7+rexp(n,lambda)-xout
x9=x8+rexp(n,lambda)-xout
x10=x9+rexp(n,lambda)-xout
x11=x10+rexp(n,lambda)-xout
x12=x11+rexp(n,lambda)-xout
x13=x12+rexp(n,lambda)-xout
x14=x13+rexp(n,lambda)-xout
x15=x14+rexp(n,lambda)-xout
x16=x15+rexp(n,lambda)-xout
x17=x16+rexp(n,lambda)-xout
x18=x17+rexp(n,lambda)-xout
x19=x18+rexp(n,lambda)-xout
x20=x19+rexp(n,lambda)-xout
x21=x20+rexp(n,lambda)-xout
x22=x21+rexp(n,lambda)-xout
x23=x22+rexp(n,lambda)-xout
x24=x23+rexp(n,lambda)-xout
x25=x24+rexp(n,lambda)-xout
x26=x25+rexp(n,lambda)-xout
x27=x26+rexp(n,lambda)-xout
x28=x27+rexp(n,lambda)-xout
x29=x28+rexp(n,lambda)-xout
x30=x29+rexp(n,lambda)-xout
我有三个疑惑:
1 - 有没有办法以简化形式编写此函数?
2 - 这一行(30 列)需要模拟 10,000 次。如何在循环中执行此操作?
3 - 每个单元格(x1,x2,x3 ...)的值必须限制在区间x0和xmax(0-8000)内。如何做到这一点?
- Is there any way to write this function in a reduced form?
我会这样做。很确定这是等效的。
ncol = 30
row = rexp(ncol, lambda)
row = cumsum(row) - xout * (1:ncol)
- This row (30 columns) needs to be simulated 10,000 times. How to do this in a loop?
将replicate
与上面的代码一起使用:
sim_data = t(replicate(10000, {
row = rexp(ncol, lambda)
row = cumsum(row) - xout * (1:ncol)
}))
replicate
给出 10000 列和 30 行。我们使用 t()
将其转置为 10000 行 30 列。
- The values of each cell (x1, x2, x3 ...) must be limited to the interval x0 and xmax (0-8000). How to do this?
使用 pmin()
和 pmax()
。不确定您是否希望在累积求和之前或之后完成此操作...
sim_data = t(replicate(10000, {
row = rexp(ncol, lambda)
row = cumsum(row) - xout * (1:ncol)
row = pmax(0, row)
row = pmin(xmax, row)
row
}))
这取决于您要对超过 8000 的值执行的操作。这是一个仅采用这些值并使用模运算符将它们环绕起来的解决方案。
library(tidyverse)
test <- data.frame(x0 = rep(0, n))
for (i in 1:30) {
new_col <- sym(paste0("x", i))
old_col <- sym(paste0("x", i - 1))
test <- test %>%
mutate(!!new_col := (!!old_col + rexp(n, lambda) - xout) %% xmax)
}
我不知道您对我在这里大量使用的 tidyverse 和 tidy 评估有多熟悉。 !!
运算符与 sym()
结合使用,将变量名转换为实际变量。 %>%
运算符 "pipes" 从一个函数到下一个函数的数据。 :=
运算符仅在您想要在左侧使用 !!
进行赋值时才需要。
我认为这是我第一次真正尝试 post 在 Whosebug 上回答问题,所以请放轻松! :)
由于我自己对 R 还很陌生,所以我认为尝试将其写出来是一种很好的做法。也许不是最有效的代码,但它有效:
xmax <- 8000
xout <- 3000
lambda <- 0.0002
n <- 1
iterations <- 30
df <- data.frame(matrix(ncol = 31, nrow = iterations))
names(df) <- c(paste("x", 0:30, sep=""))
for (j in 1:iterations) {
df$x0[j] <- 0
df$x1[j] <- df$x0[j] + rexp(n,lambda)-xout
if (df$x1[j] < 0) {
df$x1[j] <- 0
}
if (df$x1[j] > 8000) {
df$x1[j] <- 8000
}
for (i in 3:31) {
df[j,i] <- df[j, i-1] + rexp(n,lambda)-xout
if (df[j,i] < 0) {
df[j,i] <- 0
}
if (df[j,i] > 8000) {
df[j,i] <- 8000
}
}
}
您可以将 iterations
更改为 30000
,出于测试目的,我使用了 30
。另外我不知道你是否想在下一次迭代之前或之后限制为 0
和 8000
,我以前做过。
我希望在 R 中得到以下问题的帮助。
我有以下代码可以根据指数分布生成 30 列数据集:
x0=0
xmax=8000
xout=3000
lambda=0.0002
n=1
x1=x0+rexp(n,lambda)-xout
x2=x1+rexp(n,lambda)-xout
x3=x2+rexp(n,lambda)-xout
x4=x3+rexp(n,lambda)-xout
x5=x4+rexp(n,lambda)-xout
x6=x5+rexp(n,lambda)-xout
x7=x6+rexp(n,lambda)-xout
x8=x7+rexp(n,lambda)-xout
x9=x8+rexp(n,lambda)-xout
x10=x9+rexp(n,lambda)-xout
x11=x10+rexp(n,lambda)-xout
x12=x11+rexp(n,lambda)-xout
x13=x12+rexp(n,lambda)-xout
x14=x13+rexp(n,lambda)-xout
x15=x14+rexp(n,lambda)-xout
x16=x15+rexp(n,lambda)-xout
x17=x16+rexp(n,lambda)-xout
x18=x17+rexp(n,lambda)-xout
x19=x18+rexp(n,lambda)-xout
x20=x19+rexp(n,lambda)-xout
x21=x20+rexp(n,lambda)-xout
x22=x21+rexp(n,lambda)-xout
x23=x22+rexp(n,lambda)-xout
x24=x23+rexp(n,lambda)-xout
x25=x24+rexp(n,lambda)-xout
x26=x25+rexp(n,lambda)-xout
x27=x26+rexp(n,lambda)-xout
x28=x27+rexp(n,lambda)-xout
x29=x28+rexp(n,lambda)-xout
x30=x29+rexp(n,lambda)-xout
我有三个疑惑:
1 - 有没有办法以简化形式编写此函数?
2 - 这一行(30 列)需要模拟 10,000 次。如何在循环中执行此操作?
3 - 每个单元格(x1,x2,x3 ...)的值必须限制在区间x0和xmax(0-8000)内。如何做到这一点?
- Is there any way to write this function in a reduced form?
我会这样做。很确定这是等效的。
ncol = 30
row = rexp(ncol, lambda)
row = cumsum(row) - xout * (1:ncol)
- This row (30 columns) needs to be simulated 10,000 times. How to do this in a loop?
将replicate
与上面的代码一起使用:
sim_data = t(replicate(10000, {
row = rexp(ncol, lambda)
row = cumsum(row) - xout * (1:ncol)
}))
replicate
给出 10000 列和 30 行。我们使用 t()
将其转置为 10000 行 30 列。
- The values of each cell (x1, x2, x3 ...) must be limited to the interval x0 and xmax (0-8000). How to do this?
使用 pmin()
和 pmax()
。不确定您是否希望在累积求和之前或之后完成此操作...
sim_data = t(replicate(10000, {
row = rexp(ncol, lambda)
row = cumsum(row) - xout * (1:ncol)
row = pmax(0, row)
row = pmin(xmax, row)
row
}))
这取决于您要对超过 8000 的值执行的操作。这是一个仅采用这些值并使用模运算符将它们环绕起来的解决方案。
library(tidyverse)
test <- data.frame(x0 = rep(0, n))
for (i in 1:30) {
new_col <- sym(paste0("x", i))
old_col <- sym(paste0("x", i - 1))
test <- test %>%
mutate(!!new_col := (!!old_col + rexp(n, lambda) - xout) %% xmax)
}
我不知道您对我在这里大量使用的 tidyverse 和 tidy 评估有多熟悉。 !!
运算符与 sym()
结合使用,将变量名转换为实际变量。 %>%
运算符 "pipes" 从一个函数到下一个函数的数据。 :=
运算符仅在您想要在左侧使用 !!
进行赋值时才需要。
我认为这是我第一次真正尝试 post 在 Whosebug 上回答问题,所以请放轻松! :)
由于我自己对 R 还很陌生,所以我认为尝试将其写出来是一种很好的做法。也许不是最有效的代码,但它有效:
xmax <- 8000
xout <- 3000
lambda <- 0.0002
n <- 1
iterations <- 30
df <- data.frame(matrix(ncol = 31, nrow = iterations))
names(df) <- c(paste("x", 0:30, sep=""))
for (j in 1:iterations) {
df$x0[j] <- 0
df$x1[j] <- df$x0[j] + rexp(n,lambda)-xout
if (df$x1[j] < 0) {
df$x1[j] <- 0
}
if (df$x1[j] > 8000) {
df$x1[j] <- 8000
}
for (i in 3:31) {
df[j,i] <- df[j, i-1] + rexp(n,lambda)-xout
if (df[j,i] < 0) {
df[j,i] <- 0
}
if (df[j,i] > 8000) {
df[j,i] <- 8000
}
}
}
您可以将 iterations
更改为 30000
,出于测试目的,我使用了 30
。另外我不知道你是否想在下一次迭代之前或之后限制为 0
和 8000
,我以前做过。