R:预测组的新值

标签 r predict tidyverse

我为数据框中的每个组计算了不同的回归:

DF.L <- DF %>%
group_by(Channel) %>%
do(Fit = rlm(L ~ -1 + Y + I(Y^2), data = .))

我想将这组回归应用于另一个数据框。为此,我正在测试如何将其应用于同一数据框:
DF %>%
group_by(Channel) %>%
do({
    Lfit <- predict(subset(DF.L, Channel == unique(.$Channel))$Fit, .)
    data.frame(., Lfit)
})
glimpse(DF)

但我不断收到此错误:
Error in UseMethod("predict") : 
  no applicable method for 'predict' applied to an object of class "list"
Calls: %>% ... do_.grouped_df -> eval -> eval -> predict -> predict

我做错了什么?

最佳答案

使用内置 ChickWeight数据:

library(dplyr)
library(MASS)
library(broom)
library(tidyr)
library(ggplot2)


head(ChickWeight)

  weight Time Chick Diet
1     42    0     1    1
2     51    2     1    1
3     59    4     1    1
4     64    6     1    1
5     76    8     1    1
6     93   10     1    1


适合一些型号
ChickWeight_models <- ChickWeight %>% 
  group_by(Diet) %>% 
  do(fit = MASS::rlm(weight ~ Time + I(Time^2), data = .))

ChickWeight_models

Source: local data frame [4 x 2]
Groups: <by row>

# A tibble: 4 x 2
    Diet       fit
* <fctr>    <list>
1      1 <S3: rlm>
2      2 <S3: rlm>
3      3 <S3: rlm>
4      4 <S3: rlm>


所以我创建了一个与您的 非常相似的对象DF.L .这是一个包含四组的框架,每组都有一个 rlm名为 的列表列中的对象合身 .

补一些测试数据

现在我将编造一些数据来测试这个模型。在这种情况下,我将只获取原始数据并为每个变量添加一些噪声。
ChickWeight_simulated <- ChickWeight %>% 
  mutate(Time = Time + runif(length(Time)),
         weight = weight + rnorm(length(weight)))

ChickWeight_simulated 

    weight       Time Chick Diet
1 42.72075  0.9786272     1    1
2 51.12669  2.8399631     1    1
3 58.64632  4.4576380     1    1
4 63.77617  6.1083591     1    1
5 75.40434  8.1051792     1    1
6 91.75830 10.7899030     1    1


现在我们想将模型的数据框与新数据结合起来进行测试。首先我们group_bytidyr::nest模拟数据。这将创建一个对象,该对象是一个包含四个组和一个名为 的列表列的数据框。数据 ,其中的每个元素都包含一个汇总的数据框。
ChickWeight_simulated %>% group_by(Diet) %>% nest()

# A tibble: 4 x 2
    Diet               data
  <fctr>             <list>
1      1 <tibble [220 x 3]>
2      2 <tibble [120 x 3]>
3      3 <tibble [120 x 3]>
4      4 <tibble [118 x 3]>


将原始模型添加到新数据中

然后我们可以将其加入模型数据框:
ChickWeight_simulated %>% group_by(Diet) %>% nest() %>% 
  full_join(ChickWeight_models)

# A tibble: 4 x 3
    Diet               data       fit
  <fctr>             <list>    <list>
1      1 <tibble [220 x 3]> <S3: rlm>
2      2 <tibble [120 x 3]> <S3: rlm>
3      3 <tibble [120 x 3]> <S3: rlm>
4      4 <tibble [118 x 3]> <S3: rlm>


现在我们分组 饮食 再次,并使用 broom::augment在新的模拟数据上对每个模型进行预测。由于每一组是一行,所以中的每一个元素都有一个元素。合身 数据 ;我们必须使用 [[1]] 将每个列表列中的单个元素提取为可用的形式。 .
ChickWeight_simulated_predicted <-
ChickWeight_simulated %>% group_by(Diet) %>% nest() %>% 
  full_join(ChickWeight_models) %>% 
  group_by(Diet) %>% 
  do(augment(.$fit[[1]], newdata = .$data[[1]])) 

head(ChickWeight_simulated_predicted)

# A tibble: 6 x 6
# Groups:   Diet [1]
    Diet   weight       Time Chick  .fitted  .se.fit
  <fctr>    <dbl>      <dbl> <ord>    <dbl>    <dbl>
1      1 42.72075  0.9786272     1 43.62963 2.368838
2      1 51.12669  2.8399631     1 51.80855 1.758385
3      1 58.64632  4.4576380     1 59.67606 1.534051
4      1 63.77617  6.1083591     1 68.43218 1.534152
5      1 75.40434  8.1051792     1 80.00678 1.647612
6      1 91.75830 10.7899030     1 97.26450 1.726331


完整性检查

为了证明这真的只使用了来自 特定级别的模型饮食 来自 级别的模拟数据饮食 ,我们可以可视化模型拟合。
ChickWeight_simulated_predicted %>% 
  ggplot(aes(Time, weight)) + 
  geom_point(shape = 1) + 
  geom_ribbon(aes(Time, 
                  ymin = .fitted-1.96*.se.fit, 
                  ymax = .fitted+1.96*.se.fit),
              alpha = 0.5, fill = "black") +
  geom_line(aes(Time, .fitted), size = 1, color = "red") +
  facet_wrap(~Diet)

enter image description here

关于R:预测组的新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45857247/

相关文章:

r - R 中的错​​误处理和记录

r - 使用 RODBC 从 Revolution R 查询 Oracle DB

python - Keras 预测()值错误 : input doesn't have the correct dimension

R将列表中的每个 `data.frame`打印到单独的表中,标题为 `data.frame`名称

R 变异列,代表许多其他列的平均值

r - R 中耗时 - 分钟、最大值

r - 运行代码期间 R 中的内存使用情况

r - 贝叶斯预测,下标越界

R中使用rpart包的ROC曲线?

r - 根据逻辑列的顺序在 DF 中创建多个新列