【问题标题】:Wrong result from mean(x, na.rm = TRUE)mean(x, na.rm = TRUE) 的错误结果
【发布时间】:2013-03-27 23:02:21
【问题描述】:

我想计算一系列经理回报的平均值、最小值和最大值,如下所示:

ManagerRet <-data.frame(diff(Managerprices)/lag(Managerprices,k=-1))

然后我将 return = 0 替换为 NaN,因为数据是从数据库中提取的,并非所有日期都已填充。

ManagerRet = replace(ManagerRet,ManagerRet==0,NaN)

我有以下3个功能

> min(ManagerRet,na.rm = TRUE)
[1] -0.0091716

> max(ManagerRet,na.rm = TRUE)
[1] 0.007565

> mean(ManagerRet,na.rm = TRUE)*252
[1] NaN

为什么 mean 函数返回 NaN 值,而 min 和 max 正确执行计算?

您可以在下面找到动物园对象 MangerRet

> ManagerRet
               Manager
2011-10-04         NaN
2011-10-05         NaN
2011-10-06         NaN
2011-10-07         NaN
2011-10-11         NaN
2011-10-12         NaN
2011-10-13         NaN
2011-10-14         NaN
2011-10-17         NaN
2011-10-18         NaN
2011-10-19         NaN
2011-10-20         NaN
2011-10-21         NaN
2011-10-24         NaN
2011-10-25         NaN
2011-10-26         NaN
2011-10-27         NaN
2011-10-28         NaN
2011-10-31  6.3832e-04
2011-11-01 -4.4625e-06
2011-11-02  2.8142e-03
2011-11-03  5.1114e-04
2011-11-04 -1.0105e-03
2011-11-07  7.5650e-03
2011-11-08  2.1002e-03
2011-11-09 -9.1716e-03
2011-11-10  1.1173e-03
2011-11-14 -6.9207e-03
2011-11-15  2.6241e-04
2011-11-16  1.7520e-03
2011-11-17 -2.6443e-05
2011-11-18 -1.4169e-03
2011-11-21  3.7602e-04
2011-11-22  4.3982e-05
2011-11-23 -6.7328e-06
2011-11-25  1.1571e-05
2011-11-28  1.4016e-07
2011-11-29 -2.0426e-07

根据需要提供其他信息

> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: i386-w64-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=Italian_Italy.1252  LC_CTYPE=Italian_Italy.1252   
[3] LC_MONETARY=Italian_Italy.1252 LC_NUMERIC=C                  
[5] LC_TIME=Italian_Italy.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] gWidgetsRGtk2_0.0-81       gWidgets_0.0-52           
 [3] RGtk2_2.20.25              lattice_0.20-15           
 [5] moments_0.13               data.table_1.8.8          
 [7] tseries_0.10-30            timeDate_2160.97          
 [9] PerformanceAnalytics_1.1.0 xts_0.9-3                 
[11] zoo_1.7-9                  RODBC_1.3-6               

loaded via a namespace (and not attached):
[1] grid_2.15.2    quadprog_1.5-4

【问题讨论】:

  • 你能提供一个重现这种行为的小例子吗?
  • 我无法使用您的示例数据或我自己在 ubuntu linux 上使用 R 版本 2.15.3 重现此内容。能否提供sessionInfo() 的输出以及dput(ManagerRet) 的结果。
  • 我可以用 2.15.2 重现它。确保您有一个 zoo 对象。

标签: r nan zoo mean


【解决方案1】:

您应该为此使用colMeans:

colMeans(ManagerRet, na.rm=TRUE)
##       Manager 
## -6.826297e-05 

如果这是一个 data.frame,您会收到警告(但输出正确)。

在这里,您暴露了 data.frame 和 zoo 对象与 [ 子集以及逻辑矩阵索引的方式不一致。这似乎是[.zoo 中的一个错误。我已经给维护者发了邮件。

问题出现在mean.default内的这一步:

if (na.rm) 
    x <- x[!is.na(x)]

这是出错的地方:

ManagerRet[!is.na(ManagerRet)]
##   1 
## NaN 

!is.na(ManagerRet) 看起来像预期的那样,但不是:

class(!is.na(ManagerRet))
[1] "matrix"

这个类在[.zoo 中是意外的。这些行存在:

if (all(class(i) == "logical")) 
    i <- which(rep(i, length.out = n2))
else if (inherits(i, "zoo") && all(class(coredata(i)) == 
    "logical")) {
    i <- which(coredata(merge(zoo(, time(x)), i)))
}
else if (!((all(class(i) == "numeric") || all(class(i) == 
    "integer")))) 
    i <- which(MATCH(index(x), i, nomatch = 0L) > 0L)

这里的最后一行实际上是在这种情况下运行的,产生了不正确的结果。

结构:

> dput(ManagerRet)
structure(c(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.00063832, -4.4625e-06, 
0.0028142, 0.00051114, -0.0010105, 0.007565, 0.0021002, -0.0091716, 
0.0011173, -0.0069207, 0.00026241, 0.001752, -2.6443e-05, -0.0014169, 
0.00037602, 4.3982e-05, -6.7328e-06, 1.1571e-05, 1.4016e-07, 
-2.0426e-07), .Dim = c(38L, 1L), .Dimnames = list(c("2011-10-04", 
"2011-10-05", "2011-10-06", "2011-10-07", "2011-10-11", "2011-10-12", 
"2011-10-13", "2011-10-14", "2011-10-17", "2011-10-18", "2011-10-19", 
"2011-10-20", "2011-10-21", "2011-10-24", "2011-10-25", "2011-10-26", 
"2011-10-27", "2011-10-28", "2011-10-31", "2011-11-01", "2011-11-02", 
"2011-11-03", "2011-11-04", "2011-11-07", "2011-11-08", "2011-11-09", 
"2011-11-10", "2011-11-14", "2011-11-15", "2011-11-16", "2011-11-17", 
"2011-11-18", "2011-11-21", "2011-11-22", "2011-11-23", "2011-11-25", 
"2011-11-28", "2011-11-29"), "Manager"), index = 1:38, class = "zoo")

旧代码 - colMeans 是执行此操作的正确方法: 用 $ 指定“列”可以解决这个问题:

mean(ManagerRet, na.rm=TRUE)
## [1] NaN
mean(ManagerRet$Manager, na.rm=TRUE)
## [1] -6.826297e-05

【讨论】:

  • 尝试运行相同的代码,但没有库 zoo 加载。
  • @joran 相同的代码适用于 data.frame,即使加载了 zoo。
  • 我的意思是,如果我对动物园对象执行这两个mean 调用,但不运行library(zoo),我会得到相反的结果。我不知道为什么,我认为它与方法调度有关,但认为它可能是相关的。
  • ...或者更准确地说,我在第二个中得到一个错误,但在第一个中得到一个数字。
  • @joran 这很奇怪。然而,这不是问题所在。
猜你喜欢
  • 2014-10-07
  • 2020-12-19
  • 2016-04-15
  • 2019-10-04
  • 2018-01-17
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多