首页 > 解决方案 > 如何从 R 中列出的模型中提取参数?

问题描述

我正在尝试提取为我的工作设计的模型的参数,但在这样做时遇到了麻烦。我将使用 R 提供的虹膜数据作为示例数据集。

我拉入数据:

library(dplyr)
df <- iris

我设计了一个采用 Sepal Width 和 Length 的模型,并确定给定 Sepal Length 的最佳模型拟合来确定 Sepal Width (这可能是数据集的一个坏例子,我没有太注意起始参数,但我几乎可以肯定这不应该影响回答这个问题的难度)。为每个物种生产一个模型:

sepalmodel <- df %>% 
  group_by(Species) %>% 
  do(model = nls(Sepal.Width ~ a*exp(Sepal.Length*b), start = list(a = 0.5, b = 0.9), data = .)) %>% 
  ungroup()

这会生成一个数据框,其中一列是 Species,另一列是模型。在模型列中,每个模型在每一行中都由一个大列表表示,我无法从中提取其基本数据。我想直接使用参数,作为使用这些模型表示和生成数据的更干净和可重复的方式。如何从这些模型中提取 a 和 b 参数?有没有这样做的功能,还是我需要深入研究每个模型的代码?此外,该列表中是否有任何数据将其与特定物种相关联,或者它是否仅与在同一行中发现的物种直接相关?

标签: rdplyrmodelmodelr

解决方案


一种选择是使用broom::tidywith tidyr::unnest

library(tidyverse)

iris %>% 
  group_by(Species) %>% 
  do(model = nls(Sepal.Width ~ a*exp(Sepal.Length*b), start = list(a = 0.5, b = 0.9), data = .)) %>% 
  ungroup() %>%
  mutate(tidy_nls = lapply(model, broom::tidy)) %>%
  unnest(tidy_nls)

#------
# A tibble: 6 x 7
  Species    model  term  estimate std.error statistic  p.value
  <fct>      <list> <chr>    <dbl>     <dbl>     <dbl>    <dbl>
1 setosa     <nls>  a       1.07      0.162       6.58 3.23e- 8
2 setosa     <nls>  b       0.232     0.0299      7.76 5.12e-10
3 versicolor <nls>  a       1.41      0.228       6.18 1.31e- 7
4 versicolor <nls>  b       0.113     0.0269      4.21 1.11e- 4
5 virginica  <nls>  a       1.80      0.261       6.87 1.17e- 8
6 virginica  <nls>  b       0.0764    0.0218      3.51 9.97e- 4

推荐阅读