拟合分组回归模型并外推

时间:2018-11-10 22:35:33

标签: r dplyr

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

我一直关注Apply grouped model back onto data的eddis的回复

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 ||中的错误interval!=“ none”:'x ||中无效的'x'类型y'

任何人都可以帮助我如何更改此设置,以便预测对测量数据以外的温度的需求。

对于虹膜示例,我的问题是,如何对没有Sepal.Width的数据外推Sepal.Length。

谢谢!

1 个答案:

答案 0 :(得分:0)

插值

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

data.table

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

setDT(df)[, pred := lm(Sepal.Length ~ Sepal.Width)$fitted.values, by = Species]
  1. 通过pred定义新列fitted values
  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的别名应设置为与模型相同

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列,则只需将其添加到列表.()

出于可读性考虑,我实施了%>%

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