代码之家  ›  专栏  ›  技术社区  ›  Richard Herron

与使用两列数据的函数一起使用聚合(例如cov或prod)

  •  4
  • Richard Herron  · 技术社区  · 16 年前

    我有一个很长的时间序列的每日数据和101列。每个月我都想计算 cov 前100列和第101列中的每一列。这将根据每日数据生成100列中每列的第101列的每月协方差。看来 aggregate 我想用一个向量的函数,比如 mean ,但我不能让它工作 cov公司 (或 prod ).

    dput 几个月就好了。

    > library("zoo")
    > data <- read.zoo("100Size-BM.csv", header=TRUE, sep=",", format="%Y%m%d")
    > head(data[, c("R1", "R2", "R3", "R100", "Mkt.RF")])
                     R1       R2       R3     R100  Mkt.RF
    1963-07-01 -0.00212  0.00398 -0.00472 -0.00362 -0.0066
    1963-07-02 -0.00242  0.00678  0.00068 -0.00012  0.0078
    1963-07-03  0.00528  0.01078  0.00598  0.00338  0.0063
    1963-07-05  0.01738 -0.00932 -0.00072 -0.00012  0.0040
    1963-07-08  0.01048 -0.01262 -0.01332 -0.01392 -0.0062
    1963-07-09 -0.01052  0.01048  0.01738  0.01388  0.0045
    

    意思是

    > mean.temp <- aggregate(data[, 1:100], as.yearmon, mean)
    > head(mean.temp[, 1:3])
                        R1            R2            R3
    Jul 1963  0.0003845455  7.545455e-05  0.0004300000
    Aug 1963 -0.0006418182  2.412727e-03  0.0022263636
    Sep 1963  0.0016250000  1.025000e-03 -0.0002600000
    Oct 1963 -0.0007952174  2.226522e-03  0.0004873913
    Nov 1963  0.0006555556 -5.211111e-03 -0.0013888889
    Dec 1963 -0.0027066667 -1.249524e-03 -0.0005828571
    

    > cov.temp <- aggregate(data[, 1:100], as.yearmon, cov(x, data[, "Mkt.RF"]))
    Error in inherits(x, "data.frame") : object 'x' not found
    

    我也不能让它工作 cov公司 包装。

    > f <- function(x) cov(x, data[, "Mkt.RF"])
    > cov.temp <- aggregate(data[, 1:100], as.yearmon, f)
    Error in cov(x, data[, "Mkt.RF"]) : incompatible dimensions
    

    for 循环?我希望有更多 R 好吧。谢谢!

    4 回复  |  直到 16 年前
        1
  •  2
  •   Joshua Ulrich    16 年前

    你忘了 function(x) 你需要确保你每月得到正确的 data (踩在 顺便说一下)。试试这个:

    > aggregate(data, as.yearmon, function(x) cov(x,data[index(x),"Mkt.RF"]))
                      R1         R2        R3        R100     Mkt.RF
    Jul 1963  1.3265e-05 2.0340e-05 3.464e-05  2.2575e-05  6.267e-05
    Aug 1963 -7.1295e-05 2.8875e-05 1.000e-06 -9.9700e-06 -2.608e-05
    

    *请注意,我将示例数据中的最后三个观察值更改为8月份,因此将有超过一个月的输出。

        2
  •  4
  •   Community Mohan Dere    9 年前

    你可以用我写的方法 here

    tapply(1:nrow(data), data$group, function(s) cov(data$x[s], data$y[s]))
    
        3
  •  2
  •   Gavin Simpson    16 年前

    在 aggregate() FUN = cov 给你的 聚合() 打电话。然后可以将参数作为 ... 特殊论点。

    data[, "Mkt.RF"]) 作为论据 y 功能的 cov() ,所以这样的方法应该有效:

    cov.temp <- aggregate(data[, 1:100], as.yearmon, FUN = cov, y = data[, "Mkt.RF"])
    

    但是,在本例中,这似乎不起作用,因为您需要处理数据的动物园性质并能够进行子集化 data[, "Mkt.RF"] 以同样的方式 data[,1:100]1 columns are broken up by aggregate()`。所以另一种选择是指定一个函数 内联

    cov.temp <- aggregate(data[, 1:100], as.yearmon, 
                          FUN = function(x) cov(x, y = data[index(x), "Mkt.RF"]))
    

    library("zoo")
    dat <- data.frame(matrix(rnorm(365*10*6), ncol = 6))
    Dates <- seq.Date(from = as.Date("1963-07-01"), by = "days", length = 365*10)
    dat2 <- zoo(dat, order.by = Dates)
    

    这给了我们:

    > head(dat2)
                        X1         X2         X3          X4         X5         X6
    1963-07-01  0.30910867  0.5539864  0.6433690  0.20608146 -1.7706003 -0.4607610
    1963-07-02 -0.02519616 -0.1856305  1.0419578  1.01319153  0.8671110  0.1196251
    1963-07-03  1.56464024  0.4980238  0.2976338  0.05654036  0.4984225 -1.4626501
    1963-07-04 -0.24028698 -1.4365257  0.5707873 -0.05851961 -0.7176343  0.1233137
    1963-07-05 -0.87770815 -0.5217949 -2.4875626 -0.08200408 -0.6121038 -0.3881126
    1963-07-06 -0.53660576 -1.1098966  2.7411511 -1.37106883 -0.5891641  1.6322411
    

    现在,让我们假设 X6 是你的吗 "Mkt.RF"

    cov.temp <- aggregate(dat2[, 1:5], as.yearmon, 
                          FUN = function(x) cov(x, y = dat2[index(x),"X6"]))
    head(cov.temp)
    

    结果是:

    > head(cov.temp)
                      X1          X2           X3          X4          X5
    Jul 1963 -0.30185387  0.09802210  0.019282934 -0.03621272  0.05332324
    Aug 1963  0.14739044  0.04276340  0.081847499 -0.35195736 -0.14680017
    Sep 1963  0.56698393 -0.08371676  0.003870935 -0.05948173  0.07550769
    Oct 1963  0.00711595 -0.07939798  0.118030943 -0.22065278 -0.12474052
    Nov 1963  0.06551982  0.22848268  0.231967655  0.02356194 -0.24272566
    Dec 1963  0.23866775  0.29464398 -0.034313793  0.09694199 -0.10481527
    

    高温

        4
  •  0
  •   Richard Herron    16 年前

    aggregate 格式化数据,但每次计算大约需要50分钟 cov 每一个因素。一时兴起,我试了 plyr 有巨大收益的解决方案。

    cov.fn <- function(x) nrow(x) * cov(x[, 1:100], x[, 101])
    temp <- zoo(daply(data, .(as.yearmon(index(data))), cov.fn), unique(as.yearmon(index(data))))
    

    这大约需要5秒(快600倍)。我想在提高细分业务的效率方面会有很大的速度提升。

    推荐文章