0

我希望在 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)内。这该怎么做?

4

3 回答 3

2

这取决于你想对超过 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(),将变量名转换为实际变量。操作员将%>%数据从一个函数“传送”到下一个函数。:=仅当您想!!在左侧使用 a 进行分配时才需要该运算符。

我认为这是我第一次尝试在 StackOverflow 上发布答案,所以请放轻松!:)

于 2019-05-13T17:48:58.357 回答
1
  1. 有没有办法以简化的形式编写这个函数?

我会这样做。很确定这是等效的。

ncol = 30

row = rexp(ncol, lambda)
row = cumsum(row) - xout * (1:ncol)
  1. 这一行(30 列)需要模拟 10,000 次。如何在循环中执行此操作?

replicate与上面的代码一起使用:

sim_data = t(replicate(10000, {
  row = rexp(ncol, lambda)
  row = cumsum(row) - xout * (1:ncol)
}))

replicate给出 10000 列和 30 行。我们使用t()将其转置为 30 列的 10000 行。

  1. 每个单元格的值(x1, x2, x3 ...)必须限制在区间x0和xmax(0-8000)内。这该怎么做?

使用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
}))
于 2019-05-13T17:42:44.223 回答
1

由于我自己对 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
    }
  }
}

您可以更改iterations30000,用于我使用的测试目的30。另外,我不知道您是否想限制在下一次迭代之前或之后08000我以前做过。

于 2019-05-13T18:20:54.787 回答