2017-05-17 9 views
0

この例では、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. また、負の値を増やす方法もありますか?

私は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

を使用して(私はそれがはるかに少ない乱雑、リスト内の出力を置くことを提案し、後でベクターに変換することができますunlist)。 これは

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

こんにちは、それを聞いてうれしいと信用のおかげで –

関連する問題