-1

状態を A から状態 B に、またはその逆に設定するプログラムを作成しようとしています。

rnumbers <- data.frame(replicate(5,runif(2000, 0, 1)))

20 行ではなく 10000 行であることを除いて、この乱数のデータ フレームは一様分布であると想像しています。

状態 A と状態 B に移行する確率を設定します。

dt <- c(.02)
A <- dt*1
B <- dt*.5

データ フレーム rnumbers を通過する関数を作成し、数値が B 未満の場合は 0 を、数値が A 未満の場合は 1 を入力します。

step_generator <- function(x){
    step <- ifelse ( x <  B, 0, ifelse(x < A, 1, NA))
    return(step)
    }
state <- apply(rnumbers, 2, step_generator)

これは本質的に私が望むものを与えます-rnumbersの乱数の値に応じて、0、1、またはNAを含む列を持つデータフレーム。しかし、私はいくつかのことを見逃しています--

1) 各状態がどのくらい続くかを追跡したいと思います。つまり、上記のように各行を時間の変化として想像すると ( dt <- c(.02))。「状態対時間」をプロットできるようにしたい。これに対処するために、これが私が試したことです:

state1 <- transform(state, time = rep(dt))
state2 <- transform(state1, cumtime = cumsum(time))

これにより、私が望むものに近づくことができます。cumtime は .02 から .4 になります。ただし、クロックを最初の行で 0 から開始し、後続のすべての行に .02 を追加する必要があります。

2) 各状態がどれくらい続くかを知る必要があります。基本的に、各列を調べて、各状態がどれくらいの時間 (cumsum) 続くかを尋ねられるようにしたいと考えています。これにより、状態 A と状態 B の時間の分布が得られます。これを別のデータ フレームに格納します。

これは理にかなっていると思います。不明な点があればお知らせください。明確にします。

助けてくれてありがとう!

4

1 に答える 1

1

「数値が .02*1 未満で .02*.5 より大きい」間の範囲は非常に狭いため、このシミュレーションを設定している場合、最初の行のほとんどはおそらくゼロになります。ifelse条件にルックバック機能がある場合、成功を期待することはできません。その機能は「バックインデックス」を許可しません。

rstate <- rnumbers  # copy the structure
rstate[] <- NA      # preserve structure with NA's
# Init:
rstate[1, ] <- rnumbers[1, ] <  .02 & rnumbers[1, ] > 0.01

step_generator <- function(col, rnum){
    for (i in 2:length(col) ){
            if( rnum[i] < B) { col[i] <- 0  }
                       else { if (rnum[i] < A) {col[i] <- 1 }
                              else {col[i] <- col[i-1] } }
                        }
    return(col)
    }
#  Run for each column index:
for(cl in 1:5){ rstate[ , cl] <- 
                        step_generator(rstate[,cl], rnumbers[,cl]) }
于 2013-11-11T18:20:51.213 に答える