Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 估计矩阵中的偏差_R_Loops_Matrix_Time_Transition - Fatal编程技术网

R 估计矩阵中的偏差

R 估计矩阵中的偏差,r,loops,matrix,time,transition,R,Loops,Matrix,Time,Transition,我试图估计在给定的时间步长日期内,在给定的区域内,在接下来的时间步长内离开该区域的唯一ID的数量。以下是数据的一小部分: zone date id 802 2007-01-01 453444 803 2007-01-01 407680 803 2007-01-01 415786 804 2007-02-01 407680 802 2007-02-01 453444 802 2007-03-01 41

我试图估计在给定的时间步长日期内,在给定的区域内,在接下来的时间步长内离开该区域的唯一ID的数量。以下是数据的一小部分:

zone   date            id
802 2007-01-01       453444
803 2007-01-01       407680
803 2007-01-01       415786
804 2007-02-01       407680
802 2007-02-01       453444
802 2007-03-01       415786
804 2007-03-01       407680
802 2007-04-01       415786
802 2007-04-01       407680
804 2007-04-01       453444
801 2007-05-01       453444
804 2007-05-01       407680
804 2007-05-01       415786
804 2007-06-01       453444
801 2007-06-01       415786
804 2007-06-01       407680
803 2007-07-01       407680
803 2007-07-01       453444
804 2007-07-01       415786
所以我的问题是,我如何估计这些偏差?我正在尝试创建一个矩阵,该矩阵将显示每个日期/区域的离职人数,如下所示。非常感谢您提供的任何帮助

        zone   2005-07-01   2005-08-01   2005-09-01 
1       103          0          1          0      
2       106          0          0          3        
3       107          0          0          0       
4      1603          0          0          0        
5      1607          0          0          0        
6      2204          0          0          0         
7      2206          0          3          1       
8      2209          0          0          0        
9      3106          0          0          0         
10     3804          0          0          0         
11     3806          0          0          0   

我在想一个两步函数。遍历所有单个ID,询问日期[t]中的区域[i]是否等于日期[t+1]中的区域[i],如果不是,则生成1并存储在表示离开的矩阵中;然后2。将所有ID中每个区域/日期的所有1相加,得出每个时间步每个区域的偏差总和。类似于此,但在制定该函数时遇到困难新答案:

因此,第一步是按id和区域对数据进行分组,并统计每次的出发次数。这可以通过以下方式实现:

all.dates = data.frame(date=unique(zz$date))
n=nrow(all.dates)

bool.list = by(data=zz, INDICES=list(zz$zone, zz$id), FUN=function(x){
  xx = merge(x,all.dates,by=c('date'),all=T)
  xx$id[is.na(xx$id)] = 0
  return(diff(xx$id)<0)
  })
result = aggregate(tmp,list(rownames(tmp)),FUN=sum)
此列表可以轻松转换为矩阵:

tmp = matrix(unlist(bool.list),ncol=nrow(all.dates)-1,byrow=T)
colnames(tmp) = all.dates$date[2:nrow(all.dates)]
rownames(tmp) = rep(rownames(bool.list), length(colnames(bool.list)))
返回:

> tmp
    2007-02-01 2007-03-01 2007-04-01 2007-05-01 2007-06-01 2007-07-01
801      FALSE      FALSE       TRUE      FALSE      FALSE      FALSE
802      FALSE      FALSE      FALSE       TRUE      FALSE      FALSE
803       TRUE      FALSE      FALSE      FALSE      FALSE      FALSE
804      FALSE       TRUE      FALSE      FALSE      FALSE       TRUE
801      FALSE      FALSE      FALSE      FALSE      FALSE       TRUE
802      FALSE      FALSE      FALSE       TRUE      FALSE      FALSE
803       TRUE      FALSE       TRUE      FALSE      FALSE      FALSE
804      FALSE      FALSE      FALSE      FALSE       TRUE      FALSE
801      FALSE      FALSE      FALSE      FALSE       TRUE      FALSE
802      FALSE       TRUE      FALSE      FALSE      FALSE      FALSE
803      FALSE      FALSE      FALSE      FALSE      FALSE      FALSE
804      FALSE      FALSE      FALSE       TRUE      FALSE       TRUE
> result
  Group.1 2007-02-01 2007-03-01 2007-04-01 2007-05-01 2007-06-01 2007-07-01
1     801          0          0          1          0          1          1
2     802          0          1          0          2          0          0
3     803          2          0          1          0          0          0
4     804          0          1          0          1          1          2
第二步是折叠具有相同id的所有行,并计算真值的数量。这可以通过以下方式实现:

all.dates = data.frame(date=unique(zz$date))
n=nrow(all.dates)

bool.list = by(data=zz, INDICES=list(zz$zone, zz$id), FUN=function(x){
  xx = merge(x,all.dates,by=c('date'),all=T)
  xx$id[is.na(xx$id)] = 0
  return(diff(xx$id)<0)
  })
result = aggregate(tmp,list(rownames(tmp)),FUN=sum)
返回:

> tmp
    2007-02-01 2007-03-01 2007-04-01 2007-05-01 2007-06-01 2007-07-01
801      FALSE      FALSE       TRUE      FALSE      FALSE      FALSE
802      FALSE      FALSE      FALSE       TRUE      FALSE      FALSE
803       TRUE      FALSE      FALSE      FALSE      FALSE      FALSE
804      FALSE       TRUE      FALSE      FALSE      FALSE       TRUE
801      FALSE      FALSE      FALSE      FALSE      FALSE       TRUE
802      FALSE      FALSE      FALSE       TRUE      FALSE      FALSE
803       TRUE      FALSE       TRUE      FALSE      FALSE      FALSE
804      FALSE      FALSE      FALSE      FALSE       TRUE      FALSE
801      FALSE      FALSE      FALSE      FALSE       TRUE      FALSE
802      FALSE       TRUE      FALSE      FALSE      FALSE      FALSE
803      FALSE      FALSE      FALSE      FALSE      FALSE      FALSE
804      FALSE      FALSE      FALSE       TRUE      FALSE       TRUE
> result
  Group.1 2007-02-01 2007-03-01 2007-04-01 2007-05-01 2007-06-01 2007-07-01
1     801          0          0          1          0          1          1
2     802          0          1          0          2          0          0
3     803          2          0          1          0          0          0
4     804          0          1          0          1          1          2
这应该是理想的答案

旧答案:

以下是我的最佳猜测,前提是您没有指定如何处理重复数据:

# we extract all the dates:
# they will define the number of columns of the returned matrix 
all.dates = data.frame(date=unique(zz$date))

bool.list = by(data=zz, INDICES=list(zz$id), FUN=function(x){
  if (any(duplicated(x$date))) {
    x = x[!duplicated(x$date),]
  }
  # we complete so we have all dates represented, for each ID and each zone
  xx = merge(x,all.dates,all=T)
  return(diff(xx$zone)==0)
}
)

# we build the matrix from the list vectors
r = matrix(unlist(tst),ncol=nrow(all.dates)-1,nrow=length(names(tst)),byrow=T)

# some cosmetic job
colnames(r) = all.dates$date[2:nrow(all.dates)]
rownames(r) = names(bool.list)
例如,这将返回:

> r
       2007-02-01 2007-03-01 2007-04-01 2007-05-01 2007-06-01 2007-07-01
407680      FALSE      FALSE      FALSE      FALSE       TRUE      FALSE
415786         NA         NA      FALSE       TRUE      FALSE      FALSE
453444       TRUE         NA         NA      FALSE      FALSE      FALSE
您可能希望用对您有意义的任何值来替换NA,无论该值是真是假

请注意以下部分:

  if (any(duplicated(x$date))) {
    x = x[!duplicated(x$date),]
  }

在这里,我去掉了相同日期和相同id(如果重复)的第二个区域数据。您可能希望修改此选项,以使用另一种方式处理混乱数据:

您的数据混乱:2007-04-01的同一天,报告id 415786位于802和804区域。你想怎么处理?重复的是我的错误。很抱歉见下面的评论。Jealie,非常感谢你的帮助。重复的数据是我的错误。实际数据没有那样的重复。我试图复制一个小得多的数据版本,显然我的复制很马虎。我感谢你的努力!但是我很困惑,因为这个函数没有返回正确的信息。我需要一个函数来遍历所有ID,并告诉我在t离开t+1中的x区域时,x区域中有多少唯一ID。对不起,我没说清楚。实际数据有25个区域、80个时段和61个ID。这有助于澄清问题吗?糟糕,我不明白你的问题。。我会试着看看我是否能改变我的答案,使之适用于你的问题。我的问题措辞拙劣。我非常感谢你的帮助!让我知道像我这样的新手是否有办法以某种方式投票给你。我在想一个两步函数。遍历所有单个ID,询问日期[t]中的区域[i]是否等于日期[t+1]中的区域[i],如果不是,则生成1并存储在表示离开的矩阵中;然后2。将所有ID中每个区域/日期的所有1相加,得出每个时间步每个区域的偏差总和。类似这样的,但是在构造函数时有困难。哎呀,这是正确的方法。我将很快更新答案,如果答案正确,您可以接受: