如何在dplyr分组数据中单次调用normalmixEM并提取多结果存为变量
解决方法
你当前的代码每组会重复调用4次normalmixEM,既浪费计算资源,还可能因为EM算法的随机初始化导致每次结果略有差异。可以通过先把每组的模型结果存成列表列,再从列表中提取所需参数的方式,实现每组仅调用一次函数:
首先确保加载所需包:
library(dplyr) library(mixtools) library(purrr)
然后修改代码:
data2 <- data1 %>% group_by(criteria1, criteria2) %>% # 每组调用一次normalmixEM,将结果存入列表列 mutate(mix_model = list(normalmixEM(Value, k = 2))) %>% # 从列表中提取所需参数,转为数值列 mutate( mu1 = map_dbl(mix_model, ~ .x$mu[1]), mu2 = map_dbl(mix_model, ~ .x$mu[2]), lambda1 = map_dbl(mix_model, ~ .x$lambda[1]), lambda2 = map_dbl(mix_model, ~ .x$lambda[2]) ) %>% # 不需要保留模型结果的话,删掉这个列表列 select(-mix_model)
关键说明:
- 用
list()把每组的normalmixEM结果包装成列表,存入新列mix_model,这样每组只执行一次模型拟合 - 用
purrr::map_dbl()从每个模型结果中提取对应参数,转为数值型列 - 显式指定
k=2确保拟合的是两成分混合正态模型,避免默认参数可能带来的意外
内容的提问来源于stack exchange,提问作者Ali7878
相关产品推荐
相关产品推荐

