运行 每行模型参数的模型(元)data.frame
run model for each line of model parameters (meta) data.frame
本着 purr, broom, modelr 的精神,我正在尝试创建一个 "meta" data.frame,其中每一行表示数据集 (d) 和模型参数(yvar、xvars、 FE变量)。例如:
iris2 <- iris %>% mutate(Sepal.Length=Sepal.Length^2)
meta <- data.frame(n=1:4,
yvar = c('Sepal.Length','Sepal.Length','Sepal.Length','Sepal.Length'),
xvars= I(list(c('Sepal.Width'),
c('Sepal.Width','Petal.Length'),
c('Sepal.Width'),
c('Sepal.Width','Petal.Length'))),
data= I(list(iris,iris,iris2,iris2)) )
现在,我想 运行 为 "meta" 的每一列创建一个模型。然后添加带有模型输出对象的列表列 "model"。对于 运行 模型,我使用了一个辅助函数,该函数使用数据集、y 变量和 x 变量向量:
OLS_help <- function(d,y,xvars){
paste(y, paste(xvars, collapse=" + "), sep=" ~ ") %>% as.formula %>%
lm(d)
}
y <- 'Sepal.Length'
xvars <- c('Sepal.Width','Petal.Length')
OLS_help(iris,y,xvars)
如何对元数据的所有行执行 OLS_help
并将 OLS_help 的输出添加为 meta
中的列表列?我尝试了以下代码,但没有用:
meta %>% mutate(model = map2(d,yvar,xvars,OLS_help) )
Error: Can't convert a `AsIs` object to function
Call `rlang::last_error()` to see a backtrace
OBS:只有"data"(嵌套)列表列(corvered in Hadley's book here)时的解决方法是:
by_country <- gapminder %>% group_by(country, continent) %>% nest()
country_model <- function(df) { lm(lifeExp ~ year, data = df) }
by_country <- by_country %>% mutate(model = map(data, country_model))
我们可以通过以下方式使用pmap
df <- meta %>%
as_tibble() %>%
mutate_if(is.factor, as.character) %>%
mutate(fit = pmap(
list(yvar, xvars, data),
function(y, x, df) lm(reformulate(x, response = y), data = df)))
## A tibble: 4 x 5
# n yvar xvars data fit
# <int> <chr> <I<list>> <I<list>> <list>
#1 1 Sepal.Length <chr [1]> <df[,5] [150 × 5]> <lm>
#2 2 Sepal.Length <chr [2]> <df[,5] [150 × 5]> <lm>
#3 3 Sepal.Length <chr [1]> <df[,5] [150 × 5]> <lm>
#4 4 Sepal.Length <chr [2]> <df[,5] [150 × 5]> <lm>
解释:pmap
同时遍历多个参数(类似于 base R 的 Map
);这里我们同时循环 yvar
、xvar
和 data
列中的 throw 条目,然后使用 reformulate
构造要在 lm
中使用的公式。我们将 lm
拟合对象存储在 fit
.
列中
本着 purr, broom, modelr 的精神,我正在尝试创建一个 "meta" data.frame,其中每一行表示数据集 (d) 和模型参数(yvar、xvars、 FE变量)。例如:
iris2 <- iris %>% mutate(Sepal.Length=Sepal.Length^2)
meta <- data.frame(n=1:4,
yvar = c('Sepal.Length','Sepal.Length','Sepal.Length','Sepal.Length'),
xvars= I(list(c('Sepal.Width'),
c('Sepal.Width','Petal.Length'),
c('Sepal.Width'),
c('Sepal.Width','Petal.Length'))),
data= I(list(iris,iris,iris2,iris2)) )
现在,我想 运行 为 "meta" 的每一列创建一个模型。然后添加带有模型输出对象的列表列 "model"。对于 运行 模型,我使用了一个辅助函数,该函数使用数据集、y 变量和 x 变量向量:
OLS_help <- function(d,y,xvars){
paste(y, paste(xvars, collapse=" + "), sep=" ~ ") %>% as.formula %>%
lm(d)
}
y <- 'Sepal.Length'
xvars <- c('Sepal.Width','Petal.Length')
OLS_help(iris,y,xvars)
如何对元数据的所有行执行 OLS_help
并将 OLS_help 的输出添加为 meta
中的列表列?我尝试了以下代码,但没有用:
meta %>% mutate(model = map2(d,yvar,xvars,OLS_help) )
Error: Can't convert a `AsIs` object to function
Call `rlang::last_error()` to see a backtrace
OBS:只有"data"(嵌套)列表列(corvered in Hadley's book here)时的解决方法是:
by_country <- gapminder %>% group_by(country, continent) %>% nest()
country_model <- function(df) { lm(lifeExp ~ year, data = df) }
by_country <- by_country %>% mutate(model = map(data, country_model))
我们可以通过以下方式使用pmap
df <- meta %>%
as_tibble() %>%
mutate_if(is.factor, as.character) %>%
mutate(fit = pmap(
list(yvar, xvars, data),
function(y, x, df) lm(reformulate(x, response = y), data = df)))
## A tibble: 4 x 5
# n yvar xvars data fit
# <int> <chr> <I<list>> <I<list>> <list>
#1 1 Sepal.Length <chr [1]> <df[,5] [150 × 5]> <lm>
#2 2 Sepal.Length <chr [2]> <df[,5] [150 × 5]> <lm>
#3 3 Sepal.Length <chr [1]> <df[,5] [150 × 5]> <lm>
#4 4 Sepal.Length <chr [2]> <df[,5] [150 × 5]> <lm>
解释:pmap
同时遍历多个参数(类似于 base R 的 Map
);这里我们同时循环 yvar
、xvar
和 data
列中的 throw 条目,然后使用 reformulate
构造要在 lm
中使用的公式。我们将 lm
拟合对象存储在 fit
.