【问题标题】:Map (purrr) to add a range of numbers to a column one by one映射 (purrr) 将一系列数字一一添加到一列
【发布时间】:2017-10-16 11:28:25
【问题描述】:

我有一个 R 数据框,其中包含两列 colA 和 colB,以及一个合适的 glm 对象。 现在,我可以将 predict 与数据框和 glm 对象一起使用来预测结果。但是,我还想预测 colB+0.1、colB+0.2、colB+0.3 等的结果。

我想用map(purrr 包)来做这件事,但我不知道怎么做。到目前为止我尝试的是创建一个向量:

library(tibble)
range <- data_frame(colC = seq(-1, 1, by=0.1))

现在我不知道该怎么做:

  1. 将 colC 的第一个元素添加到 colB 的所有元素中
  2. 然后用 glm 对象在 colA 和 colB 上进行 predict()
  3. 将此结果按 colA 分组并将其保存到新向量中
  4. 对 colC 中的下一个元素重复 1-3 并将结果附加到新向量中,以便这个新向量具有 colC 以及预测和分组的 colB。

我希望我的问题很清楚。任何人都知道如何做到这一点? 顺便说一句,它不需要与purrr

【问题讨论】:

    标签: r predict purrr


    【解决方案1】:

    我使用函数创建了一个简单的解决方案,以便您可以对任何数据框 (data) 和任何添加到“colB”的值序列 (add) 执行此操作。

    # data has a column named 'colB' from which we cant to predict with added values.
    # add is the vector of adding values to colB
    'glm_add' <- function(data, add = seq(0.1, by = 0.1, length.out = nrow(data))){
      data <- cbind.data.frame(data, colB_add = data$colB + add)
    
      glm <- glm(colA ~ colB, data = data)
      glm_add <- glm(colA ~ colB_add, data = data)
    
      pred <- predict(glm, data)
      pred_add <- predict(glm_add, data)
    
      return(list(pred = pred, pred_add = pred_add))
    }
    

    复制一个例子来测试功能:

    data <- data.frame(colA = rnorm(10), colB = rnorm(10))
    res <- glm_add(data)
    

    以初始“colB”作为协变量的 glm 预测:

    > res$pred : 
             1          2          3          4          5          6          7          8          9         10 
    0.13415502 0.17283282 0.27074470 0.47279826 0.01846426 0.13072748 0.21737383 0.12426569 0.25197290 0.30230644 
    

    使用 colB+0.1, colB+0.2, colB+0.3, ... 作为协变量的 glm 预测:

    > res$pred_add
              1           2           3           4           5           6           7           8           9          10 
     0.19407251  0.23911968  0.39659313  0.75172751 -0.13896182  0.04575049  0.18184197 -0.02324061  0.19078440  0.25795416 
    

    编辑:

    作者实际上要求 从任何修改过的数据帧中预测 colB_add 的每个元素都添加了相同的值 0.1,然后是 0.2,等等。

    为此,我将使用lapply() 创建一个data_list,其中每个元素都是具有适当colB_add 列的数据框。

    add <- seq(0.1, by = 0.1, length.out = nrow(data))
    data_list <- lapply(1:length(add), function(i) cbind.data.frame(data, colB_add = data$colB + add[i]))
    

    然后,我将每个预测放入一个列表中

    pred_list <- list()
    > lapply(1:length(add), function(x){
    +   glm <- glm(colA ~ colB_add, data = data_list[[x]])
    +   pred_list[[x]] <<- predict(glm, data_list[[x]])
    +   })
    [[1]]
              1           2           3           4           5           6           7           8           9          10 
    -0.25321920  0.93795112 -0.04791986 -0.51229077 -0.20971718  0.36441752  0.38477508 -0.26853199 -0.00754999  0.04868279 
    
    [[2]]
              1           2           3           4           5           6           7           8           9          10 
    -0.25321920  0.93795112 -0.04791986 -0.51229077 -0.20971718  0.36441752  0.38477508 -0.26853199 -0.00754999  0.04868279 
    
    [[3]]
              1           2           3           4           5           6           7           8           9          10 
    -0.25321920  0.93795112 -0.04791986 -0.51229077 -0.20971718  0.36441752  0.38477508 -0.26853199 -0.00754999  0.04868279 
    

    请注意,这会为每个修改后的数据帧提供相同的预测。这在线性模型的理论中是显而易见的,因为每个协变量都以相同的因子变化。

    【讨论】:

    • 感谢您的回复,但这会将 'add' 的第一个元素添加到 'colB' 的第一个元素,第二个添加到第二个,等等。我想添加 ' 的第一个元素add' 到 colB 的所有元素,然后计算 predict 并保存结果,然后将 'add' 的第二个元素添加到 colB 的所有元素中并重新计算 predict 并保存结果等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多