R:在数组上应用 ecdf 函数
Posted
技术标签:
【中文标题】R:在数组上应用 ecdf 函数【英文标题】:R : Apply ecdf function on array 【发布时间】:2015-02-09 23:58:33 【问题描述】:起初我有一个这样的矩阵:
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)))
此数组是 52(周)的 Dataframe 序列。 这是一个时间分析(每周)
我想在这个数组上计算一个 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(我知道这无关紧要,但仅作为示例)
对不起,如果我的最后一个问题无法理解
【问题讨论】:
ecdf
返回一个函数,而不是一个值。
最终,我们需要的是对各种ecdf
函数的可能应用程序集的特定安排,以矩阵形式提供。学习 R 的一个常见困难是明确区分 R 函数和该函数的结果。
【参考方案1】:
答案是:
ecdf_mat <- apply( Data_array, 1:2, ecdf)
这会将前两个索引的每个组合中的值传递给函数ecdf
。这些通道中的每一个都会将一个函数返回到一个矩阵位置。如果没有一点指导,您将获得大多数人无法使用的东西:一个 52 x 4 的函数矩阵。这些函数包含在有效矩阵或数组元素的列表中:
> dim(apply( Data_array, 1:2, ecdf) )
[1] 52 4
要访问它们,您需要先使用标准“[”索引将它们从矩阵中拉出,然后通过调用“[[1]]”将它们从列表容器中拉出:
> 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..)轻松解决。您会注意到结构已被置换,因此分位数/percentiles 序列在第一列中运行。这是因为 apply 始终以列主要顺序传递其结果。有一个函数 aperm
可以让您按原始顺序重新排列它们:
re_pctiles <- aperm(pctiles, c(2,3,1) )
【讨论】:
??????????????????如果我完全误解了请求,我应该从缺少复选标记或赞成票中接受吗? 那么在 i,j 位置,您想要 i,j 项的百分位值吗? (这意味着您实际上并不希望将ecdf()
用于那些长度为 5 的序列,而是将 ecdf
应用于这些位置?)
正是这样......非常感谢,非常感谢。可能是最后一个问题,如何将此数组转换为数据框?检索我的原始矩阵格式,排序为 1 到 20(但带有百分位值),3 列和 20 行......谢谢......
我认为您已经获得了足够多的感激之情。我不是特别倾向于回答另一个含糊的问题(我不太明白。)
好的,我明白了...但是您必须知道,我非常感谢所提供的帮助...抱歉,如果我的问题不清楚,英语不是我的母语。最好的问候。以上是关于R:在数组上应用 ecdf 函数的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化使用stat_ecdf函数可视化一个分布的ECDF经验累积概率分布函数图(Simple ECDF Plot with ggplot2)