2013-04-03 51 views
3

我有幾年的數千人的轉移支付數據,每個月的條目是否觀察到了該月的支付。我想知道理論提出的某些類型的轉移接收機是否可以被數據所證實。爲此,我計劃先做一些描述性統計,然後使用包TraMineR識別觀察期內的時間模式(R)

然而,首先我想簡單地找出哪個觀察適合哪個類別。例如,一個這樣的類別是短期接受財政援助的人只能出現一次。因此,我需要確定所有僅在三個月(或更少)內收到付款的觀察結果。此外,這些接受援助期不能中斷,所以如果有人接受了兩個月的援助,兩個月沒有什麼,再一個月,這已經是一個不同的類別。這裏是一個小例子只有一年和30個觀察:

dat <- data.frame(matrix(c(0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0),ncol=12)) 

在這個例子中,我的問題是排13,否則我可以簡單的使用rowSums,然後從中挑選每一行等於或小於3的結果我可以使用哪種程序來確定僅在一個連續時間內獲得援助的觀察結果?我如何確定觀察結果如13?

回答

3

您可以使用此功能來確定支付的連續週期數和月份每期人數:

aid <- lapply(apply(dat, 1, rle), function(x) unname(x$lengths[x$values==1])) 

這將返回一個列表,每個數據的單排compoent。例如:

> aid[[1]] 
integer(0) 
> aid[[8]] 
[1] 3 
> aid[[13]] 
[1] 1 1 

表示無期第1行,3個月爲8行和13行

1月兩個時間段一個週期要找出每行有多少連續時段有,您可以使用此:

cont <- sapply(aid, length) 

結果:

> cont 
[1] 0 1 1 0 0 0 1 1 0 0 1 1 2 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 
> cont[13] 
[1] 2 

注意,僅排13有兩個SE parate時段。

+0

謝謝,這看起來非常有前途rowSums!我玩弄了apply函數,但沒有得到它的工作。再次感謝。 – Flow

2

您可以使用rle函數在不同時間過濾哪些行值等於1。

idx <- apply(dat,1,function(x){ 
    y <- rle(x) 
    length(y$lengths[y$values ==1])> 1 
}) 

dat[idx,] 
    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 
13 0 0 0 0 0 0 0 0 1 0 0 1 

那麼你可以申請在filtred數據

rowSums(dat[!idx,]) <=3