为 R 中的 1 个以上线性模型生成预测区间?
Generating prediction intervals for more than 1 linear model in R?
我正在尝试使用函数 predict() 为一组新数据生成预测区间,但跨越我为数据集生成的多个模型。我在使用 lapply 方面相对缺乏经验,但我认为它应该对这个过程有所帮助:
#Calling in my libraries:
library(dplyr)
#Creating dataset:
DNase <- DNase
#Generating models, one for each "Run" in DNAse:
model_dna <- DNase %>%
group_by(Run) %>%
do(model_dna_group = lm(log(density) ~ log(conc), data = .)) %>% ungroup()
#Creating a new data set to be used to generate predictions:
new_dna <- as.data.frame(DNase$conc) %>%
mutate(conc = DNase$conc * 2) %>% select(conc)
#Attempting to apply predict to these models for a new data frame:
new_dna_w_predictions <- lapply(
X = model_dna,
FUN = predict,
newdata = new_dna,
interval = "prediction",
level = 0.9
)
然而,这会导致以下错误:
get(as.character(FUN), mode = "function", envir = envir) 出错:
未找到模式 'function' 的对象 'model_dna'
我不确定如何最好地构造此 lapply 函数,尤其是在多个模型中使用时。有没有更简洁的方法来解决这个问题?
您的 object model_dna
是一个 data.frame(更准确地说:一个小标题),它在第二列中包含 lm
-objects" model_dna_group".
在 lapply
调用中,您应该引用该列,而不是整个数据框。 Lapply 尝试在数据框的列上使用 predict
而不是第二列中的 lm
-object。
所以按如下方式编辑您的调用并且它有效:
new_dna_w_predictions <- lapply(
X = model_dna$model_dna_group,
FUN = predict,
newdata = new_dna,
interval = "prediction",
level = 0.9
)
这里有完整的tidyverse
解决方案:
# Calling in my libraries:
library(dplyr)
library(purrr)
# Creating dataset:
DNase <- DNase
# Creating a new data set to be used to generate predictions:
new_dna <- DNase %>% transmute(conc = conc * 2) # simplified
# Generating models, one for each "Run" in DNAse:
model_dna <- DNase %>%
group_by(Run) %>%
summarise(model_dna_group = list(lm(log(density) ~ log(conc))))
model_dna
#> # A tibble: 11 x 2
#> Run model_dna_group
#> <ord> <list>
#> 1 10 <lm>
#> 2 11 <lm>
#> 3 9 <lm>
#> 4 1 <lm>
#> 5 4 <lm>
#> 6 8 <lm>
#> 7 5 <lm>
#> 8 7 <lm>
#> 9 6 <lm>
#> 10 2 <lm>
#> 11 3 <lm>
# Run predictions
model_dna %>%
group_by(Run) %>%
summarise(map(model_dna_group, predict, newdata = new_dna, interval = "prediction", level = 0.9) %>% map_dfr(as_tibble),
.groups = "drop")
#> # A tibble: 1,936 x 4
#> Run fit lwr upr
#> <ord> <dbl> <dbl> <dbl>
#> 1 10 -2.16 -2.48 -1.85
#> 2 10 -2.16 -2.48 -1.85
#> 3 10 -1.33 -1.64 -1.03
#> 4 10 -1.33 -1.64 -1.03
#> 5 10 -0.918 -1.22 -0.617
#> 6 10 -0.918 -1.22 -0.617
#> 7 10 -0.503 -0.804 -0.201
#> 8 10 -0.503 -0.804 -0.201
#> 9 10 -0.0873 -0.392 0.217
#> 10 10 -0.0873 -0.392 0.217
#> # ... with 1,926 more rows
由 reprex package (v2.0.0)
于 2021-11-19 创建
通知:
- 在
dplyr
1.0 之后,您不再需要为这种情况使用 do
- 使用
map
和 map_dfr
您可以计算您的预测并将它们很好地适合您的 tibble
我正在尝试使用函数 predict() 为一组新数据生成预测区间,但跨越我为数据集生成的多个模型。我在使用 lapply 方面相对缺乏经验,但我认为它应该对这个过程有所帮助:
#Calling in my libraries:
library(dplyr)
#Creating dataset:
DNase <- DNase
#Generating models, one for each "Run" in DNAse:
model_dna <- DNase %>%
group_by(Run) %>%
do(model_dna_group = lm(log(density) ~ log(conc), data = .)) %>% ungroup()
#Creating a new data set to be used to generate predictions:
new_dna <- as.data.frame(DNase$conc) %>%
mutate(conc = DNase$conc * 2) %>% select(conc)
#Attempting to apply predict to these models for a new data frame:
new_dna_w_predictions <- lapply(
X = model_dna,
FUN = predict,
newdata = new_dna,
interval = "prediction",
level = 0.9
)
然而,这会导致以下错误:
get(as.character(FUN), mode = "function", envir = envir) 出错: 未找到模式 'function' 的对象 'model_dna'
我不确定如何最好地构造此 lapply 函数,尤其是在多个模型中使用时。有没有更简洁的方法来解决这个问题?
您的 object model_dna
是一个 data.frame(更准确地说:一个小标题),它在第二列中包含 lm
-objects" model_dna_group".
在 lapply
调用中,您应该引用该列,而不是整个数据框。 Lapply 尝试在数据框的列上使用 predict
而不是第二列中的 lm
-object。
所以按如下方式编辑您的调用并且它有效:
new_dna_w_predictions <- lapply(
X = model_dna$model_dna_group,
FUN = predict,
newdata = new_dna,
interval = "prediction",
level = 0.9
)
这里有完整的tidyverse
解决方案:
# Calling in my libraries:
library(dplyr)
library(purrr)
# Creating dataset:
DNase <- DNase
# Creating a new data set to be used to generate predictions:
new_dna <- DNase %>% transmute(conc = conc * 2) # simplified
# Generating models, one for each "Run" in DNAse:
model_dna <- DNase %>%
group_by(Run) %>%
summarise(model_dna_group = list(lm(log(density) ~ log(conc))))
model_dna
#> # A tibble: 11 x 2
#> Run model_dna_group
#> <ord> <list>
#> 1 10 <lm>
#> 2 11 <lm>
#> 3 9 <lm>
#> 4 1 <lm>
#> 5 4 <lm>
#> 6 8 <lm>
#> 7 5 <lm>
#> 8 7 <lm>
#> 9 6 <lm>
#> 10 2 <lm>
#> 11 3 <lm>
# Run predictions
model_dna %>%
group_by(Run) %>%
summarise(map(model_dna_group, predict, newdata = new_dna, interval = "prediction", level = 0.9) %>% map_dfr(as_tibble),
.groups = "drop")
#> # A tibble: 1,936 x 4
#> Run fit lwr upr
#> <ord> <dbl> <dbl> <dbl>
#> 1 10 -2.16 -2.48 -1.85
#> 2 10 -2.16 -2.48 -1.85
#> 3 10 -1.33 -1.64 -1.03
#> 4 10 -1.33 -1.64 -1.03
#> 5 10 -0.918 -1.22 -0.617
#> 6 10 -0.918 -1.22 -0.617
#> 7 10 -0.503 -0.804 -0.201
#> 8 10 -0.503 -0.804 -0.201
#> 9 10 -0.0873 -0.392 0.217
#> 10 10 -0.0873 -0.392 0.217
#> # ... with 1,926 more rows
由 reprex package (v2.0.0)
于 2021-11-19 创建通知:
- 在
dplyr
1.0 之后,您不再需要为这种情况使用do
- 使用
map
和map_dfr
您可以计算您的预测并将它们很好地适合您的tibble