代码之家  ›  专栏  ›  技术社区  ›  conor

使用行名称收集

  •  1
  • conor  · 技术社区  · 8 年前

    我正在预测时间序列数据(使用行名称),希望在区分方法的同时,将一些精度度量组合到单个数据帧中。例如:

    library(fpp2)
    beer.train <- window(beer, end = c(1994, 12))
    beer.test <- window(beer, start = 1995)
    AccMean <- accuracy(meanf(beer.train, h = 8), beer.test)
    AccRW <- accuracy(rwf(beer.train, h = 8), beer.test)
    rbind(AccMean, AccRW)
    #                         ME     RMSE      MAE         MPE     MAPE     MASE       ACF1 Theil's U
    # Training set -9.474373e-15 19.82001 15.97396  -1.6202496 10.42125 1.726914  0.4628439        NA
    # Test set     -1.289583e+01 17.57100 13.57292 -10.1596449 10.60310 1.467342 -0.4904015 0.7998411
    # Training set  3.829787e-01 20.18004 15.14894  -0.6398801 10.05885 1.637723 -0.1547700        NA
    # Test set     -4.375000e+01 45.34865 43.75000 -32.6470928 32.64709 4.729730 -0.4904015 2.0312792
    

    但是,我希望看到如下输出:

    # Method   Set            ME     RMSE      MAE         MPE     MAPE     MASE       ACF1 Theil's U
    #   Mean Train -9.474373e-15 19.82001 15.97396  -1.6202496 10.42125 1.726914  0.4628439        NA
    #   Mean  Test -1.289583e+01 17.57100 13.57292 -10.1596449 10.60310 1.467342 -0.4904015 0.7998411
    #     RW Train  3.829787e-01 20.18004 15.14894  -0.6398801 10.05885 1.637723 -0.1547700        NA
    #     RW  Test -4.375000e+01 45.34865 43.75000 -32.6470928 32.64709 4.729730 -0.4904015 2.0312792
    

    一种方法是执行以下操作:

    AccMean <- AccMean %>% as.data.frame() %>% mutate(Method = "Mean", Set = c("Train", "Test")) %>% select(Method, Set, everything())
    AccRW <- AccRW %>% as.data.frame() %>% mutate(Method = "RW", Set = c("Train", "Test")) %>% select(Method, Set, everything())
    rbind(AccRW, AccMean)
    #   Method   Set            ME     RMSE      MAE         MPE     MAPE     MASE       ACF1 Theil's U
    # 1   Mean Train -9.474373e-15 19.82001 15.97396  -1.6202496 10.42125 1.726914  0.4628439        NA
    # 2   Mean  Test -1.289583e+01 17.57100 13.57292 -10.1596449 10.60310 1.467342 -0.4904015 0.7998411
    # 3     RW Train  3.829787e-01 20.18004 15.14894  -0.6398801 10.05885 1.637723 -0.1547700        NA
    # 4     RW  Test -4.375000e+01 45.34865 43.75000 -32.6470928 32.64709 4.729730 -0.4904015 2.0312792
    

    不过,我想把这个概括为 n 方法,而上面的方法对于大型的 n . 我想用 gather() 会有帮助的,但我似乎不能让它工作 row.names 。

    注意 this related question 不回答我的问题。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Melissa Key    8 年前

    这很容易用 purrr 的 imap 功能。

    第一个技巧是预先定义所有的测试方法 功能 并贴上标签:

    # define and label test methods
    test_methods <- list(
      Mean = meanf,
      RW = rwf
    )
    

    然后,我们让 imap_dfr 做一些有趣的事情-将每个函数应用于数据,重新格式化它,标记它,并将它绑定在一起

    library(purrr)
    result_df <- imap_dfr(test_methods, function(f, .method) {
      tmp <- accuracy(f(beer.train, h = 8), beer.test) 
      tmp %>%
        as.data.frame() %>%
        mutate(
          Set = str_extract(rownames(tmp), "Train|Test"),
          Method = .method
        ) %>% 
        select(Method, Set, everything())
    })
    

    我们使用 IMAP 因为它会自动设置函数中的第二个变量(这里 .method )名单上的名字(例如 test_methods )这正是这里所需要的。

    更新

    要向函数调用添加参数,我们需要将该信息合并到测试方法中。例如:

    test_methods <- list(
      Mean = meanf,
      RW = rwf,
      RWdrift = function(x, ...) rwf(x, drift = TRUE, ...)
    )
    

    需要点符号,因为 h=8 硬编码到函数调用中。如果 h 也不同,您需要将其从 IMAPGDFR ,并全部指定 试验方法 条目:

    test_methods <- list(
      Mean08 = function(x) meanf(x, h = 8),
      Mean10 = function(x) meanf(x, h = 10),
      RW8 = function(x) rwf(x, h = 8,
      RWdrift8 = function(x, ...) rwf(x, h = 8, drift = TRUE, ...)
    )