改变一列模型:"Error: Problem with `mutate()` input `model`. x Input `model` must be a vector, not a `lm` o



我有一个数据帧,其中包含一列模型公式定义。我想更改一个新列,其中每一行都是基于相应行模型定义的模型。

一些数据:

# Set up
library(tidyverse)
library(lubridate)

# Create data
mydf <- data.frame(
cohort = seq(ymd('2019-01-01'), ymd('2019-12-31'), by = '1 days'),
n = rnorm(365, 1000, 50) %>% round,
cohort_cost = rnorm(365, 800, 50)
) %>% 
crossing(tenure_days = 0:365) %>% 
mutate(activity_date = cohort + days(tenure_days)) %>% 
mutate(daily_revenue = rnorm(nrow(.), 20, 1)) %>% 
group_by(cohort) %>% 
arrange(activity_date) %>% 
mutate(cumulative_revenue = cumsum(daily_revenue)) %>% 
arrange(cohort, activity_date) %>% 
mutate(payback_velocity = round(cumulative_revenue / cohort_cost, 2)) %>% 
select(cohort, n, cohort_cost, activity_date, tenure_days, everything())
## wider data
mydf_wide <- mydf %>% 
select(cohort, n, cohort_cost, tenure_days, payback_velocity) %>% 
group_by(cohort, n, cohort_cost) %>% 
pivot_wider(names_from = tenure_days, values_from = payback_velocity, names_prefix = 'velocity_day_')

现在,最后一个问题代码块。它在最后一行失败:

models <- data.frame(
from = mydf$tenure_days %>% unique,
to = mydf$tenure_days %>% unique
) %>% 
expand.grid %>% 
filter(to > from) %>% 
filter(from > 0) %>% 
arrange(from) %>% 
mutate(mod_formula = paste0('velocity_day_', to, ' ~ velocity_day_', from)) %>% 
mutate(model = lm(as.formula(mod_formula), data = mydf_wide))

错误:mutate()输入model出现问题。x输入model必须是矢量,而不是lm对象。ℹ输入modellm(as.formula(mod_formula), data = mydf_wide)

如果我运行最后一个代码块减去最后一行,并查看生成的数据帧"模型",它看起来是这样的:

models %>% head
from to                     mod_formula
1    1  2 velocity_day_2 ~ velocity_day_1
2    1  3 velocity_day_3 ~ velocity_day_1
3    1  4 velocity_day_4 ~ velocity_day_1
4    1  5 velocity_day_5 ~ velocity_day_1
5    1  6 velocity_day_6 ~ velocity_day_1
6    1  7 velocity_day_7 ~ velocity_day_1

我试着把它列成一个列表栏,但据我所知,要做到这一点,我需要按顺序分组。但在这种情况下,我需要按照所有内容分组。我修改了最后一个代码块:

models <- data.frame(
from = mydf$tenure_days %>% unique,
to = mydf$tenure_days %>% unique
) %>% 
expand.grid %>% 
filter(to > from) %>% 
filter(from > 0) %>% 
arrange(from) %>% 
mutate(mod_formula = paste0('velocity_day_', to, ' ~ velocity_day_', from)) %>% 
group_by_all() %>% 
nest() %>% 
mutate(model = lm(as.formula(mod_formula), data = mydf_wide))

然而,这会导致相同的错误。

如何在"models"中添加一个新列,该列包含基于字段"mod_formula"中公式的每行线性模型?

lm未矢量化。添加rowwise为每一行创建一个模型。

library(dplyr)
models <- data.frame(
from = mydf$tenure_days %>% unique,
to = mydf$tenure_days %>% unique
) %>% 
expand.grid %>% 
filter(to > from) %>% 
filter(from > 0) %>% 
arrange(from) %>% 
mutate(mod_formula = paste0('velocity_day_', to, ' ~ velocity_day_', from)) %>%
rowwise() %>%
mutate(model = list(lm(as.formula(mod_formula), data = mydf_wide)))
models
#  from    to mod_formula                     model 
#  <int> <int> <chr>                           <list>
#1     1     2 velocity_day_2 ~ velocity_day_1 <lm>  
#2     1     3 velocity_day_3 ~ velocity_day_1 <lm>  
#3     1     4 velocity_day_4 ~ velocity_day_1 <lm>  
#4     1     5 velocity_day_5 ~ velocity_day_1 <lm>  
#5     1     6 velocity_day_6 ~ velocity_day_1 <lm>  
#6     1     7 velocity_day_7 ~ velocity_day_1 <lm>  
#...
#...

您也可以使用map而不是rowwise

mutate(model = purrr::map(mod_formula, ~lm(.x, data = mydf_wide))) 

相关内容

最新更新