在R语言中为多个线性模型生成预测区间:lapply调用报错及优化方法咨询
解决多模型预测区间生成的问题
我来帮你搞定这个问题~首先咱们先拆解下你遇到的错误原因:
你用group_by() %>% do()生成的model_dna是一个数据框,其中只有model_dna_group这一列是存储各个Run对应模型的列表。而你把整个数据框传给lapply的X参数时,它会按列迭代(而不是按模型迭代),这就导致predict函数接收到的不是模型对象,自然会报错说找不到对应的函数模式的对象。
修正后的基础实现
只需要把lapply的处理对象改成数据框里的模型列表列就行:
# 修正后的lapply调用 new_dna_w_predictions <- lapply( X = model_dna$model_dna_group, FUN = predict, newdata = new_dna, interval = "prediction", level = 0.9 )
这样lapply就会遍历每个Run对应的lm模型,为你的new_dna数据集生成预测区间了。
更简洁的tidyverse实现方式
如果你习惯用tidyverse的工具,推荐用purrr::map替代lapply,结合nest()来更连贯地完成从建模到预测的流程,结果也更容易后续分析:
library(tidyverse) # 1. 准备新数据集 new_dna <- tibble(conc = DNase$conc * 2) # 2. 分组建模+生成预测,全程tidy风格 model_results <- DNase %>% group_by(Run) %>% nest() %>% # 将每个Run的数据嵌套为列表列,替代do()的写法 mutate( # 为每个分组数据生成模型 model = map(data, ~lm(log(density) ~ log(conc), data = .x)), # 用每个模型生成预测区间 predictions = map(model, predict, newdata = new_dna, interval = "prediction", level = 0.9) ) # 可选:将预测结果展开为数据框格式,方便查看 model_results <- model_results %>% mutate(predictions = map(predictions, as.data.frame)) %>% unnest(predictions)
这种方式的好处是所有步骤都在一个管道里完成,模型和预测结果都和原分组信息(Run)绑定在一起,后续做可视化或者进一步分析会更方便。
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

