如何基于GAMLSS的fitDist批量为数据框120列创建拟合函数?
嘿,刚好之前做过类似的批量分布拟合任务,完全不用手动逐个写函数循环!给你两个实用的方案,分tidyverse和base R版本,看你习惯用哪个:
方案1:用tidyverse的purrr包(推荐,代码更直观)
先加载需要的包,purrr的map函数天生适合这种批量处理列的场景:
library(gamlss) library(purrr) library(dplyr)
假设你的数据框叫my_data,第一列是需要指定GG分布的列(比如列名是target_col):
- 先单独处理第一列(用你指定的GG分布):
# 处理第一列,指定广义伽马分布 fit_first_col <- fitDist(my_data$target_col, dist = "GG")
- 批量处理剩下的119列,自动选择最优分布(默认会测试一系列候选分布,也可以自己指定候选集):
# 排除第一列,对其余每列批量应用fitDist remaining_fits <- my_data %>% select(-target_col) %>% # 去掉已处理的第一列 map(~ fitDist(.x)) # 对每列执行fitDist,自动选最优分布
如果你想给剩下的列统一指定候选分布(比如限定在正态、泊松、广义伽马、GB2这几个里选),可以改成:
# 指定候选分布的批量处理 remaining_fits <- my_data %>% select(-target_col) %>% map(~ fitDist(.x, dist = c("NO", "PO", "GG", "GB2")))
- 把第一列的结果和批量结果合并成一个列表,方便后续查看:
all_fits <- c(list(target_col = fit_first_col), remaining_fits)
方案2:Base R版本(不用额外加载tidyverse)
如果习惯用base R,用lapply就能搞定:
library(gamlss) # 处理第一列 fit_first_col <- fitDist(my_data[, 1], dist = "GG") # 批量处理其余列 remaining_fits <- lapply(my_data[, -1], fitDist) # 合并结果 all_fits <- c(list(names(my_data)[1] = fit_first_col), remaining_fits)
一些实用的后续操作
- 查看某一列的拟合结果:直接调用列表元素,比如
all_fits$second_col - 提取所有列的最优分布名称,整理成表格:
# 用tidyverse的方式提取 library(tibble) best_distributions <- map_df(all_fits, ~ tibble( column_name = names(.x)[1], best_distribution = .x$best.dist )) # Base R方式提取 best_distributions <- data.frame( column_name = names(all_fits), best_distribution = sapply(all_fits, function(x) x$best.dist) )
注意事项
- 如果数据框里有非数值列,记得先筛选数值列,比如用
my_data %>% select_if(is.numeric)(tidyverse)或者my_data[, sapply(my_data, is.numeric)](base R),避免fitDist报错 - 部分列可能因数据不符合某些分布出现警告,若不想看到可以在
fitDist外面加suppressWarnings(),比如map(~ suppressWarnings(fitDist(.x)))
内容的提问来源于stack exchange,提问作者MeR
相关产品推荐
相关产品推荐

