2017-05-17 55 views
0

在此示例中,我试图在4个时间点为3个人生成一个随机时间序列(下面的x包含每个人的第一个时间点)。我希望这些值随机增加,而不是随着时间减少。以下是我目前的解决方案。通过在R中随机增加值来扩展向量

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. 如何使负值也增加?

我设法解决这个感谢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

'X * runif(3 .8,1.2)' – Roland

+0

@Roland谢谢你的提示!我刚刚学到了一些关于R如何处理矢量的新东西。 – lillemets

回答

1

我建议把输出列表,它少了很多乱七八糟的,你可以在以后转化为向量(使用不公开)。 这是我怎么会重写代码

x<-rnorm(3) 
time<-3 
output<-list(x) #init output list with initial data 

par1<-c(0.8,0.9,1) 
par2<-c(1.2,1.3,1.4) 
for(i in 1:time){ 
    a<-unlist(lapply(x,function(x){x+runif(1,par1[i],par2[i])})) 

    output[[i+1]]<-a 
    x<-a 
} 

让我知道如果这能解决所有的问题..

+0

谢谢!这确实解决了所有3个问题。我根据自己的需求定制了解决方案,并将其包含在问题中。 – lillemets

+0

嗨,很高兴听到这一点,并感谢信用 –