- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将模型子集适合嵌套数据框。虽然我见过许多将同一模型拟合到不同数据组的示例,但我还没有遇到过将不同模型拟合到组织为嵌套数据框的数据集的示例。
作为示例,我从 R For Data Science“许多模型”部分获取了代码。这里的目标是使相同的模型适用于不同的国家(群体)。我希望做的是扩展这一点,并将多种不同的竞争模式适应不同的国家(群体)。理想情况下,每个竞争模型将作为新列存储在嵌套数据框中。
预先感谢您的帮助!
# Example code
library(dplyr)
library(ggplot2)
library(modelr)
library(purrr)
library(tidyr)
library(gapminder)
# Create nested data
by_country <- gapminder %>%
group_by(country, continent) %>%
nest()
# Model 1
country_model <- function(df) {
lm(lifeExp ~ year, data = df)
}
# Map model 1 to the data
by_country <- by_country %>%
mutate(model = map(data, country_model))
# Model 2
country_model2 <- function(df) {
lm(lifeExp ~ year + gdpPercap, data = df)
}
# Map Model 2 to the data
by_country <- by_country %>%
mutate(model2 = map(data, country_model2))
已更新为了澄清我的问题,我知道我可以通过调用每个模型的 mutate 来手动执行此操作。我认为我追求的是更灵活的东西,几乎类似于下面的代码。然而,这些函数将调用模型函数,而不是函数“runif”、“rnorm”和“rpois”。例如“country_model”和“country_model2”。希望这会有所帮助。
# Example code
sim <- dplyr::frame_data(
~f, ~params,
"runif", list(min = -1, max = -1),
"rnorm", list(sd = 5),
"rpois", list(lambda = 10)
)
sim %>% dplyr::mutate(
samples = invoke_map(f, params, n = 10)
)
最佳答案
这是一种使用更新中提到的 invoke_map 函数的方法。
它涉及创建三个函数。这些功能: 1. 创建一个数据框,在其中指定您的模型 2. 使用invoke_map函数将这些模型应用到您的数据中 3. reshape 结果,以便它们可以作为列添加到原始 by_country 数据框中
# Example code
library(dplyr)
library(ggplot2)
library(modelr)
library(purrr)
library(tidyr)
library(gapminder)
# Create nested data
by_country <- gapminder %>%
group_by(country, continent) %>%
nest()
# Function that creates dataframe suitable for invoke_map function
create_model_df <-
function(x){
dplyr::frame_data(
~model_name, ~f, ~params,
"country_model", "lm", list(formula =as.formula("lifeExp ~ year + gdpPercap"), data = x ),
"country_model2","lm", list(formula =as.formula("lifeExp ~ year"),data = x )
)
}
# Function that applies invoke_map function
apply_models <-
function(x){
x %>%
mutate( model_fit = invoke_map(f, params))
}
# Function that the results from invoke map
reshape_results <-
function(x){
x %>%
select(model_name,model_fit) %>% spread(model_name,model_fit)
}
# Apply these functions
by_country %>%
mutate(model_df = data %>%
map(create_model_df) %>%
map(apply_models) %>%
map(reshape_results)) %>%
unnest(model_df)
#> # A tibble: 142 x 5
#> country continent data country_model country_model2
#> <fctr> <fctr> <list> <list> <list>
#> 1 Afghanistan Asia <tibble [12 x 4]> <S3: lm> <S3: lm>
#> 2 Albania Europe <tibble [12 x 4]> <S3: lm> <S3: lm>
#> 3 Algeria Africa <tibble [12 x 4]> <S3: lm> <S3: lm>
#> 4 Angola Africa <tibble [12 x 4]> <S3: lm> <S3: lm>
#> 5 Argentina Americas <tibble [12 x 4]> <S3: lm> <S3: lm>
#> 6 Australia Oceania <tibble [12 x 4]> <S3: lm> <S3: lm>
#> 7 Austria Europe <tibble [12 x 4]> <S3: lm> <S3: lm>
#> 8 Bahrain Asia <tibble [12 x 4]> <S3: lm> <S3: lm>
#> 9 Bangladesh Asia <tibble [12 x 4]> <S3: lm> <S3: lm>
#> 10 Belgium Europe <tibble [12 x 4]> <S3: lm> <S3: lm>
#> # ... with 132 more rows
关于R 将竞争模型拟合到 dplyr/tidyr/broom 框架内的嵌套数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39024446/
我正在为网络元分析准备数据,但在输入列时遇到困难。 如果我有这个初始数据集: Study Trt y sd n 1 1 -1.22 3.70 54 1
这个问题在这里已经有了答案: How do I get a contingency table? (6 个回答) Faster ways to calculate frequencies and ca
我有一个看起来像这样的数据集 site % unite(D01, D01_1, D01_2, sep = "/", remove = TRUE) %>% unite(D02, D02_1, D
我有以下数据: > data data unique grouping value 1 1 a 15 2 2
我注意到了 tidyr(0.4.0)使用 spread 时对值列进行排序,如 tidyr(0.3.1)按照它们在 gather 之前的顺序返回值列. 可重现的示例 1: library(dplyr)
我正在学习 dplyr,来自 plyr,我想从 xtabs 的输出生成(每组)列(每交互)。 简短摘要:我得到 A B 1 NA NA 2 当我想要 A B 1 2 xta
我有一个 data.frame,其中一些单元格包含逗号分隔值的字符串: d % separate_rows(b) %>% separate_rows(c) # a b c # 1
Tidy eval now supports glue strings 所以这很好用: my_summarise5 % mutate( "mean_{{mean_var}}" :=
我有看起来像这样的数据 df = data.frame(name=c("A","A","B","B"), group=c("g1","g2","g1","g2"),
我有一个面板结构的数据框:两年内每个单元的 2 个观察值: library(tidyr) mydf % spread(year, value) %>% filter(2012 > 0.5) 以下工作但
我正在尝试使用 tidyr 包中的 extract 将包含单个字符串的列拆分为 3 个单独的列。该问题的最小工作示例如下: # A tibble: 3 x 1 question_codes
我在 R 中有以下数据框 my_df_test my_df_test V1 V2 V3 V4 V5 V6_S1 V6_S2 V7_S1 V7_S2 1 1 A S1
我有一个看起来像这样的数据框。我将其命名为“df_raw”。 "HRHHID\t15\tHOUSEHOLD IDENTIFIER\t(Part 1)\t1- 15" "HRMONTH\t2\tMONT
我搜了又搜,找到了类似的东西,但没有什么是对的。希望这个问题没有得到解答。 假设我有一个包含 Y、N 的列,有时还有额外的信息 df%separate('Surgery',c("Surgery
我想使用 tidyr 将数据分布在多个列上。 dat % gather(variable, value, -(ID:col1)) %>% unite(temp, col1, variab
tidyr 的扩展函数仅接受不带引号的列名。有没有办法可以传递包含列名的变量例如 # example using gather() library("tidyr") dummy.data % gath
我的问题类似于 this question .我正在尝试 tidyr::gather多列。但是,链接中提供的解决方案并不理想,因为所有列中的属性通常不相同,因此它们被删除。 请注意,我知道如何使用基础
我在 R 中有以下数据框 my_df_test my_df_test V1 V2 V3 V4 V5 V6_S1 V6_S2 V7_S1 V7_S2 1 1 A S1
我有一个看起来像这样的数据框。我将其命名为“df_raw”。 "HRHHID\t15\tHOUSEHOLD IDENTIFIER\t(Part 1)\t1- 15" "HRMONTH\t2\tMONT
这个问题在这里已经有了答案: Reshaping data.frame from wide to long format (8 个答案) 关闭 2 年前。 我正在尝试学习如何使用 tidyr 将宽数
我是一名优秀的程序员,十分优秀!