【问题标题】:fitting grouped regression model and extrapolating拟合分组回归模型并外推
【发布时间】:2018-11-11 21:24:41
【问题描述】:

我有一个包含以下列的数据框:耗电量 E(超过 24 小时)、小时 h 和温度 t。 我想根据我没有数据的温度推断每小时的消耗量。

我一直在关注Apply grouped model back onto dataeddis的回复

combinedprofiles <- data.table(df)

#Make a model for each hour
my.models <- combined_profiles[, list(Model = list(lm(E ~ t))),
                keyby = h] 

#Make predictions on dataset
setkey(combined_profiles, hour)
combined_profiles[my.models, prediction := predict(i.Model[[1]], .SD), by = .EACHI]

我已尝试将具有新温度的数据框作为新数据添加到预测中。

  newtemp<- data.frame(temp_round=c(6,7))
  combined_profiles[my.models, prediction := predict(newdata=newtemp,i.Model[[1]], .SD), by = .EACHI]

但这给了我以下错误: se.fit 中的错误 ||间隔!=“无”:“x”中的“x”类型无效||是的

谁能帮助我如何改变它以预测测量数据之外的温度需求。

对于 iris 示例,我的问题是,如何在我们没有 Sepal.Width 的数据中推断 Sepal.Length。

谢谢!

【问题讨论】:

  • 您要求我们读取您大脑皮层上过多的神经元。

标签: r dplyr


【解决方案1】:

插值

library(tidyverse)
library(data.table)

dplyr 澄清您想要的data.table 解决方案:

df <- as_tibble(iris)
df
#> # A tibble: 150 x 5
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#>           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
#>  1          5.1         3.5          1.4         0.2 setosa 
#>  2          4.9         3            1.4         0.2 setosa 
#>  3          4.7         3.2          1.3         0.2 setosa 
#>  4          4.6         3.1          1.5         0.2 setosa 
#>  5          5           3.6          1.4         0.2 setosa 
#>  6          5.4         3.9          1.7         0.4 setosa 
#>  7          4.6         3.4          1.4         0.3 setosa 
#>  8          5           3.4          1.5         0.2 setosa 
#>  9          4.4         2.9          1.4         0.2 setosa 
#> 10          4.9         3.1          1.5         0.1 setosa 
#> # ... with 140 more rows

我们可以mutate() 拟合值

df %>%
  group_by(Species) %>% # for each Species
  mutate(
    pred = lm(Sepal.Length ~ Sepal.Width)$fitted.values
  )
#> # A tibble: 150 x 6
#> # Groups:   Species [3]
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species  pred
#>           <dbl>       <dbl>        <dbl>       <dbl> <fct>   <dbl>
#>  1          5.1         3.5          1.4         0.2 setosa   5.06
#>  2          4.9         3            1.4         0.2 setosa   4.71
#>  3          4.7         3.2          1.3         0.2 setosa   4.85
#>  4          4.6         3.1          1.5         0.2 setosa   4.78
#>  5          5           3.6          1.4         0.2 setosa   5.12
#>  6          5.4         3.9          1.7         0.4 setosa   5.33
#>  7          4.6         3.4          1.4         0.3 setosa   4.99
#>  8          5           3.4          1.5         0.2 setosa   4.99
#>  9          4.4         2.9          1.4         0.2 setosa   4.64
#> 10          4.9         3.1          1.5         0.1 setosa   4.78
#> # ... with 140 more rows

数据表

对于这个df,我们可以应用相同的逻辑。

setDT(df)[, pred := lm(Sepal.Length ~ Sepal.Width)$fitted.values, by = Species]
  1. 通过fitted values 定义新列pred
  2. by各组Species

然后我们得到相同的结果:

df
#>      Sepal.Length Sepal.Width Petal.Length Petal.Width   Species     pred
#>   1:          5.1         3.5          1.4         0.2    setosa 5.055715
#>   2:          4.9         3.0          1.4         0.2    setosa 4.710470
#>   3:          4.7         3.2          1.3         0.2    setosa 4.848568
#>   4:          4.6         3.1          1.5         0.2    setosa 4.779519
#>   5:          5.0         3.6          1.4         0.2    setosa 5.124764
#>  ---                                                                     
#> 146:          6.7         3.0          5.2         2.3 virginica 6.611440
#> 147:          6.3         2.5          5.0         1.9 virginica 6.160673
#> 148:          6.5         3.0          5.2         2.0 virginica 6.611440
#> 149:          6.2         3.4          5.4         2.3 virginica 6.972054
#> 150:          5.9         3.0          5.1         1.8 virginica 6.611440

外推

首先,newdata 的 colname 应设置为与模型相同

newtemp <- data.frame(Sepal.Width = c(6, 7))

data.table 中进行聚合时,您可以在.(predict(mod, newdata)) 中进行:

dt <- as.data.table(df)

dt[, .(pred = predict(lm(Sepal.Length ~ Sepal.Width, data = .SD), newdata = newtemp)), by = Species]
#>       Species      pred
#> 1:     setosa  6.781940
#> 2:     setosa  7.472429
#> 3: versicolor  8.730201
#> 4: versicolor  9.595279
#> 5:  virginica  9.316043
#> 6:  virginica 10.217578

如果您想要每个组的newdata 列,您可以在列表中添加术语.()

为了可读性,我实现了%&gt;%

df %>%
  data.table() %>%
  .[,
    .(newdata = unlist(newtemp, use.names = FALSE),
      pred = predict(lm(Sepal.Length ~ Sepal.Width, data = .SD), newdata = newtemp)),
    by = Species]
#>       Species newdata      pred
#> 1:     setosa       6  6.781940
#> 2:     setosa       7  7.472429
#> 3: versicolor       6  8.730201
#> 4: versicolor       7  9.595279
#> 5:  virginica       6  9.316043
#> 6:  virginica       7 10.217578

【讨论】:

  • 谢谢,效果很好。有没有办法将包含新数据的列添加到预测中?
  • @maaar,您是指newdata 列吗?
  • 我添加了专栏。您可以在 data.table 的list() 内写附加术语。我想如果我们不unlist你的data.frame,就会出错。
猜你喜欢
  • 2016-09-03
  • 2018-03-26
  • 2021-12-08
  • 2020-12-22
  • 2014-05-07
  • 2018-03-17
  • 1970-01-01
  • 2022-10-04
  • 2017-09-14
相关资源
最近更新 更多