首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >变异一列模型:“错误:‘Mutate ()’not `model`. x not`model‘的问题必须是向量,而不是’be‘对象。”

变异一列模型:“错误:‘Mutate ()’not `model`. x not`model‘的问题必须是向量,而不是’be‘对象。”
EN

Stack Overflow用户
提问于 2020-09-02 01:23:04
回答 1查看 27.2K关注 0票数 3

我有一个dataframe,它包含一个模型公式定义作为列。我想突变一个新列,其中每一行都是基于相应的行模型定义的模型。

一些数据:

代码语言:javascript
复制
# 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_')

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

代码语言:javascript
复制
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)

如果我运行最后一个代码块减去最后一行,并查看生成的数据框架“模型”,它如下所示:

代码语言:javascript
复制
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

我试着把它作为一个列表列,但为了做到这一点,我意识到我需要分组。但在这种情况下,我需要按每件事进行分组。我修改了最后一个代码块:

代码语言:javascript
复制
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))

但是,这会导致相同的错误。

我如何在“模型”中添加一个新列,其中包含基于字段‘mod_式’中的公式的每一行的线性模型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-02 01:29:25

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

代码语言:javascript
复制
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

代码语言:javascript
复制
mutate(model = purrr::map(mod_formula, ~lm(.x, data = mydf_wide))) 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63697426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档