【问题标题】:How to apply sw_glance using mutate_at to nested time-series dataframe?如何使用 mutate_at 将 sw_glance 应用于嵌套的时间序列数据帧?
【发布时间】:2019-09-29 14:07:13
【问题描述】:

我在嵌套(分组)df 上预测多个模型。如果我将 sw_glance 分别应用于每个列表列,我的问题就解决了,但是,对于我的示例,如果我应用 6 个模型,那么它要求我进行六次变异。我花了无数个小时,我想我快到了。为什么我不能执行下面的行并用函数带来的新值覆盖现有变量? (我在下面包含了一个代表,第 5 步是我卡住的地方)

models_df%<>% map(~mutate_at(.x,vars(mod_ets,mod_hw)),sw_glance)

仅举几例,以下是列表:

-tidyverse 文档,其中提到对于分组变量,mutate_at 会失败,除非我添加-group_cols()。不行。

-purrr 文档:我尝试pmap 传递变量列表。我尝试将 map 与mutate_at 结合使用。我自己尝试了mutate_at。我试过命名函数(.f ...)和匿名函数(~..),但什么都没有

-我在这里尝试了几篇文章,几乎让我到达了那里。 我升级到了 tidyr 1.0,如果需要可以包含我的 sessionInfo()。

#1 dummy df
df=tibble(Tag=seq(as.Date("2010-01-01"),by="month", length.out = 60), gatos=sample(c("a","b"),60, replace = T), sales=runif(60))

#2 nesting 
nested_df= df %>% 
  group_by(gatos) %>% 
  nest()

#3 declaring time series
ts_vector = nested_df %>%
  mutate(data.ts=map(data,tk_ts,select=-Tag,start=c(2010,01),freq=12))

# Step 4: Apply models
models_df = ts_vector %>% 
  mutate(mod_ets = map(data.ts,ets),
         mod_hw = map(data.ts,HoltWinters))

# Step 5: Apply sw_glance (Does NOT work)
models_df %<>%
map(~mutate_at(.x,vars(mod_ets,mod_hw)),sw_glance)

Error in UseMethod("tbl_vars") : 
  no applicable method for 'tbl_vars' applied to an object of class "character"

# This DOES work
models_df %<>% 
  mutate(foo_ets=map(mod_ets,sw_glance),
         foo_hw=map(mod_hw,sw_glance))

我希望mutate_at 修改现有变量而无需添加新变量。否则,如果可能的话,我将不胜感激如何一次性将sw_glance 应用于多个模型。谢谢你们。非常感谢您的帮助。

【问题讨论】:

  • tk_ts 是什么?
  • @Ronak : timetk 包的时间序列强制部分的基本功能。

标签: r purrr dplyr broom


【解决方案1】:

我们可以编写一个函数来将sw_glance 应用于每个模型

library(tidyverse)

apply_models <- function(list_model) map(list_model, sweep::sw_glance)

并使用mutate_at将其应用于多个列

models_df %>% mutate_at(vars(mod_ets, mod_hw), apply_models)

#  gatos           data data.ts mod_ets           mod_hw           
#  <chr> <list<df[,2]>> <list>  <list>            <list>           
#1 b           [31 × 2] <ts>    <tibble [1 × 12]> <tibble [1 × 12]>
#2 a           [29 × 2] <ts>    <tibble [1 × 12]> <tibble [1 × 12]>

【讨论】:

  • 嗨@Ronak!非常感谢您采用这种方法。虽然它有效,但它会创建更多列。在上面我提到的文本中,我希望使用 sw_glance 应用该函数后会带来的新值来影响/替换(我们称之为覆盖)mod_ets 和 mod_hw。对那个有什么想法吗?
  • @Will ohh..我以为您专门在原始数据框中寻找新列。在这种情况下,您可以使用models_df %&gt;% mutate_at(vars(mod_ets, mod_hw), apply_models)。这是你的意思吗?
  • !我刚刚通过从函数中删除“foo”来修改文本,现在它通过覆盖两个当前变量来工作。所以,这已经处理好了。关于为什么我不能直接应用 sw_glance 而必须编写一个函数的任何想法?
  • sw_glance 一次只接受一个模型。当我们向它传递多个模型(列)时,我们需要使用map(或lapply),它会一次传递一个模型。
  • 不..不完全是。一列!= 一个模型。事实上,对于每一列,我们都有多个模型,即等于行数。对于共享的示例,我们在 mod_etsmod_hw 列中各有 2 个模型。使用mutate_at,我们循环遍历vars 中提到的每一列,使用map,我们循环遍历这些列中的每个值。
猜你喜欢
  • 2018-02-03
  • 2021-02-28
  • 1970-01-01
  • 2011-04-07
  • 2019-01-27
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多