如何在R语言map函数中实现抽样、模型拟合并保存中间数据集
使用map函数同时保存抽样数据集并拟合模型
现有单次操作代码
你已经实现了单次抽样拟合的代码:
dat <- data.frame( x=rnorm(20, mean=5, sd=1), y=rnorm(20, mean=6, sd=1), weight = rnorm(20, mean=1, sd=0.2) ) f <- function(data, var.x, var.y, n) { # 抽样 data_subset <- data %>% sample_n(n, weight = weight, replace = T) %>% select(all_of(var.x), all_of(var.y)) %>% drop_na() # 拟合模型 model <- lm(unlist(data_subset %>% select(y)) ~ unlist(data_subset %>% select(x))) print(model) } f(data=dat, var.x="x", var.y="y", n=20)
你的尝试代码(存在语法问题)
你尝试用map实现批量操作,但写法有误:
f <- function(data, var.x, var.y, n) { map(seq_len(20), # 抽样 data_subset <- data %>% sample_n(n, weight = weight, replace = T) %>% select(all_of(var.x), all_of(var.y)) %>% drop_na() # 拟合模型 model <- lm(unlist(data_subset %>% select(y)) ~ unlist(data_subset %>% select(x))) print(model) ) }
正确实现方法
当然可以同时保存抽样数据和模型,核心是让map的每个迭代返回一个包含抽样数据集和模型的列表,同时要注意map的第二个参数必须是一个函数。修正后的代码如下:
library(tidyverse) dat <- data.frame( x=rnorm(20, mean=5, sd=1), y=rnorm(20, mean=6, sd=1), weight = rnorm(20, mean=1, sd=0.2) ) batch_fit <- function(data, var.x, var.y, n, times) { map(seq_len(times), function(.x) { # 抽样步骤 data_subset <- data %>% sample_n(n, weight = weight, replace = TRUE) %>% select(all_of(var.x), all_of(var.y)) %>% drop_na() # 拟合模型,简化写法避免unlist model <- lm(formula(paste(var.y, "~", var.x)), data = data_subset) # 返回包含抽样数据和模型的列表 list(sampled_data = data_subset, model = model) }) } # 运行20次抽样拟合 results <- batch_fit(data=dat, var.x="x", var.y="y", n=20, times=20)
结果查看示例
- 查看第3次抽样的数据集:
results[[3]]$sampled_data - 查看第5次拟合的模型结果:
summary(results[[5]]$model) - 打印所有模型结果:
walk(results, ~print(summary(.x$model)))
关键说明
map的第二个参数必须是匿名函数(或命名函数),每个迭代独立执行一次抽样和拟合- 每次迭代返回一个列表,把需要保存的抽样数据、模型等对象都封装进去
- 用
formula(paste(...))直接生成回归公式,替代繁琐的unlist写法 - 新增
times参数控制抽样拟合的次数,让函数更灵活
内容的提问来源于stack exchange,提问作者EML
相关产品推荐
相关产品推荐

