R:在数组上应用ecdf函数

时间:2014-12-11 13:21:47

标签: arrays r reformat ecdf

起初我有一个像这样的矩阵:

x <- matrix(rnorm(1e3),260)

然后是一个数组

lst <- lapply(seq(1,length(x[,1]), by=52), function(i) x[i:(i+51),])
Data_array <- array(unlist(lst), dim=c(52,length(x[1,]),(length(x[,1])/52)))

此数组是Dataframe的序列,由52(周)组成。 这是一个时间分析(每周)

我想在这个数组上计算一个ecdf函数。

, , 1

             [,1]        [,2]        [,3]
 [1,]  **0.66319631**  0.01004290  0.02133477
 [2,] -1.64273648  0.23105503  1.02862145
 [3,]  1.17083363 -0.49700717 -0.01119745

, , 2

             [,1]        [,2]         [,3]
 [1,] **-0.79365987**  1.28394049 -0.547763434
 [2,] -0.09221301  1.07676841  0.570294731
 [3,]  0.20293308  1.00182888  0.247373981

, , 3

             [,1]         [,2]        [,3]
 [1,]  **1.03862172** -0.961678683  1.25334651
 [2,]  0.58476540  0.745250484 -0.06183788
 [3,]  0.24057690  1.226575038  0.23363005

为每个单元格计算ecdf函数。这是每周一次的季节性分析。

即。此时间序列的计算分位数(**):0.66319631; -0.79365987; 1.03862172

对于MEAN来说,它起作用:

array_lag_sum<-apply(Data_array,c(1,2),FUN=function(x){mean(x,na.rm=TRUE)})

我尝试了类似ecdf的功能,但它没有用。

percent_array<-apply(Data_array,c(1,2),FUN=function(u){ecdf(u)(u)})

然后......它没有完成,我想重新格式化这个数组,就像数据数据帧(x)的原始格式一样。 (就像一个rbind但在阵列上。)

非常感谢你的帮助。

编辑:

抱歉,但我不知道自己是否如此清醒。对我而言,阵列很复杂;

但是使用您的方法,如果我有这个简单的数据框:

B <- matrix(seq(1,20), 20, 3)

    > B
          [,1] [,2] [,3]
     [1,]    1    1    1
     [2,]    2    2    2
     [3,]    3    3    3
     [4,]    4    4    4
     [5,]    5    5    5
     [6,]    6    6    6
     [7,]    7    7    7
     [8,]    8    8    8
     [9,]    9    9    9
    [10,]   10   10   10
    [11,]   11   11   11
    [12,]   12   12   12
    [13,]   13   13   13
    [14,]   14   14   14
    [15,]   15   15   15
    [16,]   16   16   16
    [17,]   17   17   17
    [18,]   18   18   18
    [19,]   19   19   19
    [20,]   20   20   20

你的功能给出了:

    Data_array <- array( B, dim=c(10,3,5))

, , 1

      [,1] [,2] [,3]
 [1,]    1   11    1
 [2,]    2   12    2
 [3,]    3   13    3
 [4,]    4   14    4
 [5,]    5   15    5
 [6,]    6   16    6
 [7,]    7   17    7
 [8,]    8   18    8
 [9,]    9   19    9
[10,]   10   20   10

, , 2

      [,1] [,2] [,3]
 [1,]   11    1   11
 [2,]   12    2   12
 [3,]   13    3   13
 [4,]   14    4   14
 [5,]   15    5   15
 [6,]   16    6   16
 [7,]   17    7   17
 [8,]   18    8   18
 [9,]   19    9   19
[10,]   20   10   20

或者我会更像这样:

,,1

      [,1] [,2] [,3]
 [1,]    1    1    1
 [2,]    2    2    2
 [3,]    3    3    3
 [4,]    4    4    4
 [5,]    5    5    5
 [6,]    6    6    6
 [7,]    7    7    7
 [8,]    8    8    8
 [9,]    9    9    9
[10,]   10   10   10

,,2
      [,1] [,2] [,3]
 [1,]   11   11   11
 [2,]   12   12   12
 [3,]   13   13   13
 [4,]   14   14   14
 [5,]   15   15   15
 [6,]   16   16   16
 [7,]   17   17   17
 [8,]   18   18   18
 [9,]   19   19   19
[10,]   20   20   20

并获得一个表格,该表格是时间序列的百分位值。 每列和每行的百分位数值为1和11,2和12(我知道它不相关,但它仅仅是例证)

对不起,如果我的上一个问题不可理解

1 个答案:

答案 0 :(得分:2)

答案是:

 ecdf_mat <- apply( Data_array, 1:2, ecdf)

这会将前两个索引的每个组合的值传递给函数ecdf。每个传递都将函数返回到矩阵位置。如果没有一点指导,你会得到大多数人无法使用的东西:一个52 x 4矩阵的函数。这些函数包含在有效矩阵或数组元素的列表中:

> dim(apply( Data_array, 1:2, ecdf) )
[1] 52  4

要访问它们,您需要先使用标准&#34; [&#34;索引,然后通过调用&#34; [[1]]&#34;

将它们从列表容器中拉出
> str(apply( Data_array, 1:2, ecdf)[1,1] )
List of 1
 $ :function (v)  
  ..- attr(*, "class")= chr [1:3] "ecdf" "stepfun" "function"
  ..- attr(*, "call")= language FUN(newX[, i], ...)

> apply( Data_array, 1:2, ecdf)[1,1][[1]]
Empirical CDF 
Call: FUN(newX[, i], ...)
 x[1:5] = -0.92217, -0.37471, 0.058284, 0.28502, 0.44391

> apply( Data_array, 1:2, ecdf)[1,1][[1]](0)
[1] 0.4

修改:------

看起来你并不想要ecdf自己(尽管我没有回应我的努力让你认识到这种区别),而是想要一个形状相同的数组,其中包含ij的百分位数值被认为是个体长度k序列的位置。我可以想到两种方法来做到这一点。第一个将使用我构建和演示的ecdf函数矩阵,但我相信这是更加巴洛克式的方法,并且更容易为您提供更直接的路径。我通过使长第一维只有10长的时间,冒昧地使这个更容易管理。

x <- matrix(rnorm(1e3),260)
lst <- lapply(seq(1,length(x[,1]), by=10), function(i) x[i:(i+51),])
Data_array <- array(unlist(lst), dim=c(10,length(x[1,]),(length(x[,1])/52

pctiles2 <-  apply( Data_array,  1:2, function(x) ecdf(x)(x) )

> str(pctiles2)
 num [1:5, 1:10, 1:4] 0.8 0.4 0.6 0.2 1 0.4 1 0.2 0.6 0.8 ...

它们实际上并不是百分位数,但可以通过从ecdf调用中滑出100*(或将结果乘以100来轻松补救)。您会注意到结构已被置换因此,分位数/百分位数序列在第一列向下运行。因为apply总是以列主要顺序递送其结果。有一个函数aperm,允许您按原始顺序重新排列这些:

re_pctiles <- aperm(pctiles, c(2,3,1) )