在观测中识别随时间变化的模式(R)

时间:2013-04-03 13:14:45

标签: r traminer

我有几年来数千人转账付款的数据,每月一次,无论观察是否收到该月的付款。我想知道理论提出的某些类型的转移接收器是否可以被数据确认。为此,我计划先做一些描述性统计,然后再使用包TraMineR

然而,首先,我想简单地确定哪个观察适合哪个类别。例如,一个这样的类别是经济援助的短期接收者,他们只出现一次。因此,我需要确定仅收到三个月(或更少)付款的所有观察结果。此外,这些接受援助的时期不能中断,所以如果有人接受了两个月的援助,那么两个月,然后再一个月,这已经是一个不同的类别了。这是一个只有一年和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之类的观察?

2 个答案:

答案 0 :(得分: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行没有句号,第8行为1个月,第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行有两个不同的句号。

答案 1 :(得分: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

然后,您可以在过滤数据上应用rowSums

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