如何在R中使用分组频数数据拟合Log-normal分布?
加权拟合对数正态分布的解决方法
你遇到的问题是fitdist的调用方式错误——它的第一个参数是待拟合的观测向量,第二个参数是分布名称,不能直接把频数count放在第二个位置。要同时用age(分组变量)和count(频数权重)拟合对数正态分布,有两种高效的实现方式:
方法1:展开为原始观测数据
把每个age按对应的count次数重复,生成完整的观测向量后再拟合:
library(fitdistrplus) df <- data.frame(age=c(18,22,24,25,26,27,28,29,31,32,35,37,40,44,49,50,55,60,63,67,80), count=c(100,110,120,125,125,110,100,90,80,70,60,45,30,15,12,10,8,3,2,1,1)) # 展开数据:每个age重复count次 age_expanded <- rep(df$age, times = df$count) # 拟合对数正态分布 fit_result <- fitdist(age_expanded, "lnorm") # 查看包含meandlog、sdlog的参数结果 summary(fit_result)
方法2:使用权重参数(更高效)
直接通过fitdist的weights参数传入频数,无需展开数据,适合大样本场景:
library(fitdistrplus) df <- data.frame(age=c(18,22,24,25,26,27,28,29,31,32,35,37,40,44,49,50,55,60,63,67,80), count=c(100,110,120,125,125,110,100,90,80,70,60,45,30,15,12,10,8,3,2,1,1)) # 传入weights参数拟合 fit_result_weighted <- fitdist(df$age, "lnorm", weights = df$count) # 查看参数结果 summary(fit_result_weighted)
两种方法得到的meandlog(对数均值)和sdlog(对数标准差)参数结果一致,都是基于age的加权观测拟合出的对数正态分布参数。
内容的提问来源于stack exchange,提问作者user21242742
相关产品推荐
相关产品推荐

