通过随机增加R

时间:2017-05-17 09:58:16

标签: r random

在这个例子中,我试图在4个时间点为3个人生成随机时间序列(x以下包含每个人的第1个时间点)。我希望值随机增加而不是随时间减少。以下是我目前的解决方案。

set.seed(0)
x <- rnorm(3)
x
[1]  1.2629543 -0.3262334  1.3297993
y <- c(x, 
       x*runif(1,.8,1.2), 
       x*runif(1,.9,1.3), 
       x*runif(1,1,1.4))
y
[1]  1.2629543 -0.3262334  1.3297993  1.4642135 -0.3782206  1.5417106  1.6138915 -0.4168839  1.6993107  1.5967772
[11] -0.4124631  1.6812906

这有一些问题。

  1. 对于每个人,使用相同的系数来计算相同时间点的值,从而产生相同的趋势。我怎么能得到每个乘法的随机系数?我可以使用lapply,但是矢量将由个人“分组”而非时间点。
  2. 我不希望单独编写最后一个时间点的公式,并且非常精确。确切的系数并不重要,我只需要让值略有增加,但也应允许偶尔减少。我怎样才能更“有效”地扩展矢量?
  3. 如何使负值也增加?
  4. 感谢Federico Manigrasso,我设法解决了这个问题。解决方案如下。

    TimeSer <- function(num.id, years, init.val) {
      df <- data.frame(id = factor(rep(1:num.id, length(years))), 
                       year = rep(years, each = num.id))
      yrs <- length(years) - 1
      minim <- seq(-.1, by = -.1, len = yrs)
      maxim <- seq(.4, by = .4, len = yrs)
      val <- list(init.val)
      for (i in 1:yrs) {
        val[[i + 1]] <- unlist(lapply(init.val, function (x) {
          x + (x * runif(1, minim[i], maxim[i])) 
          }))
        }
      df$val <- unlist(val)
      df
    }
    
    df <- TimeSer(num.id = 3, years = 2006:2016, init.val = rnorm(3,1e5, 1e5))
    

    结果的视觉表示:

    num.id <- length(unique(df$id))
    par(mfrow=c(1,num.id))
    lapply(1:num.id, function(x) {
      plot(unique(df$year), df$val[df$id == x], type = 'l', col = x)
      })
    

    Random time series

1 个答案:

答案 0 :(得分:1)

我建议将输出放在一个列表中,它不那么混乱,你可以稍后转换成一个向量(使用unlist)。 这就是我重写代码的方式

{{1}}

如果这可以解决您的所有问题,请告诉我。