【问题标题】:Apply grouped model back onto data将分组模型应用回数据
【发布时间】:2014-08-12 22:44:51
【问题描述】:

我适合这样的模特

groupedTrainingSet = group_by(trainingSet, geo);
models = do(groupedTrainingSet, mod = lm(revenue ~ julian, data=.))

grouptedTestSet = group_by(testSet, geo);
// TODO: apply model back to test set

模型的样子

 geo     mod
1   APAC <S3:lm>
2  LATAM <S3:lm>
3     ME <S3:lm>
7    ROW <S3:lm>
4     WE <S3:lm>
5     NA <S3:lm>

我认为我应该能够再次应用“do”,但我没有看到它......或者我可以按照以下方式做一些事情

apply(trainingData, fitted =
    predict(select(models, geo==geo)$mod, .));

但我不确定那里的语法。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    不确定这里有没有问题,但我认为data.table 包在这里特别有效。

    #Load data.table package
    require(data.table)
    iris <- data.table(iris)
    
    #Make a model for each species group
    iris.models <- iris[, list(Model = list(lm(Sepal.Length ~ Sepal.Width))),
                          keyby = Species]
    
    #Make predictions on dataset
    setkey(iris, Species)
    iris[iris.models, prediction := predict(i.Model[[1]], .SD), by = .EACHI]
    

    (对于data.table 版本by = .EACHI 部分)

    【讨论】:

    【解决方案2】:

    按照@Mike.Gahan 使用的方法,这是获得类似答案的dplyr 方法:

    library(dplyr) 
    
    iris.models <- iris %>%
      group_by(Species) %>%
      do(mod = lm(Sepal.Length ~ Sepal.Width, data = .))
    
    iris %>% 
      tbl_df %>%
      left_join(iris.models) %>%
      rowwise %>%
      mutate(Sepal.Length_pred = predict(mod,
                                        newdata = list("Sepal.Width" = Sepal.Width)))
    

    或者,如果您创建一个预测函数,您可以一步完成:

    m <- function(df) {
      mod <- lm(Sepal.Length ~ Sepal.Width, data = df)
      pred <- predict(mod,newdata = df["Sepal.Width"])
      data.frame(df,pred)
    }
    
    iris %>%
      group_by(Species) %>%
      do(m(.))
    

    【讨论】:

    • tbl_df 命令的意义何在?我查看了文档,但看不到它是如何应用的。
    • 在这种情况下没有太大区别;使用dplyr已经成为我的习惯,因为它更方便的打印方式。如果省略该行,则一切都应该以相同的方式工作。
    • 我正要请求扩展你的答案,但决定应该是its own question
    • 您必须小心第一种方法,因为您将lm 对象添加到数据框的每一行。使用 iris 数据,生成的数据帧具有 3731096 字节的 object.size。如果在最后一行之后使用管道 select(-mod),则生成的数据帧只有 8576 个字节。
    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2021-07-19
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多