【发布时间】:2019-01-26 17:50:49
【问题描述】:
如何从模型的嵌套数据框中创建一列公式(例如 y ~ x 或 y ~ log(x) 或 ...)?
在下面的尝试中,模型列包含 R 平方最大值的模型。创建一列模型公式的目的是确定每一行中使用了哪个模型。
library(tidyverse)
library(broom)
df <- gapminder::gapminder %>%
select(country, x = year, y = lifeExp) %>%
group_by(country) %>%
nest()
rsq_f <- function(model){summary(model)$r.squared}
best_model <- function(df){
models <- list(
lm(formula = y ~ x, data = df),
lm(formula = y ~ log(x), data = df),
lm(formula = log(y) ~ x, data = df),
lm(formula = log(y) ~ log(x), data = df)
)
R_squared <- map_dbl(models, rsq_f)
best_model_num <- which.max(R_squared)
models[best_model_num][[1]]
}
models <- df %>%
mutate(
model = map(data, best_model),
rsq = map(model, broom::glance) %>% map_dbl("r.squared"),
fun_call = map(model, formula)
)
输出是
> models
# A tibble: 142 x 5
country data model rsq fun_call
<fct> <list> <list> <dbl> <list>
1 Afghanistan <tibble [12 x 2]> <S3: lm> 0.949 <S3: formula>
2 Albania <tibble [12 x 2]> <S3: lm> 0.912 <S3: formula>
3 Algeria <tibble [12 x 2]> <S3: lm> 0.986 <S3: formula>
4 Angola <tibble [12 x 2]> <S3: lm> 0.890 <S3: formula>
5 Argentina <tibble [12 x 2]> <S3: lm> 0.996 <S3: formula>
6 Australia <tibble [12 x 2]> <S3: lm> 0.983 <S3: formula>
7 Austria <tibble [12 x 2]> <S3: lm> 0.994 <S3: formula>
8 Bahrain <tibble [12 x 2]> <S3: lm> 0.968 <S3: formula>
9 Bangladesh <tibble [12 x 2]> <S3: lm> 0.997 <S3: formula>
10 Belgium <tibble [12 x 2]> <S3: lm> 0.995 <S3: formula>
# ... with 132 more rows
我想实际查看模型使用的公式,而不是<S3: formula>。
【问题讨论】:
-
你能
...%>% unnest(fun_call)吗? -
models %>% unnest(fun_call)错误:每一列必须是向量列表或数据框列表 [fun_call] - 猜测这意味着没有...... -
每个
lm模型应该有一个terms元素,这是一个list使用的公式,如果你使用as.character(lm$terms),你可能有一些东西可以使用.. -
因为这给你的格式不完全正确,你需要重新排列它,比如:
paste(as.character(my_lm$terms)[2],as.character(my_lm$terms)[1], as.character(my_lm$terms)[-c(1:2)])如果我理解正确你的问题,这会给你一个带有正确公式的字符串.. -
公式不是小标题可以以表格格式显示的原子类型。您只是想在控制台中查看它吗?然后你应该编写自己的打印函数。或者像其他人提到的,将公式转换为字符值进行显示。