首页 > 解决方案 > 如何在 R 中获得函数“fitdistcens”以准确地将分布拟合到审查和未审查数据的混合?

问题描述

我需要将对数正态分布、帕累托分布和广义帕累托分布拟合到一些经验数据,这些数据是审查数据和未审查数据的组合。我尝试使用 fitdistrplus 包中的函数 fitdistcens 。

我生成了一些由审查数据和未经审查数据组成的人工数据(我的 R 代码如下)。

删失后的数据可以描述为:100到200之间有5000个值,200到500之间有700个值,500到1000之间有600个值,以此类推。我们没有关于这些值的更多信息。删失数据的所有 bin 的完整列表是:

[100, 200]

[200, 500]

[500, 1000]

[1000, 2000]

[2000, 5000]

[5000, 10000]

[10000, 20000]

[20000, 100000]

未经审查的数据是通过生成 70 个均值为 0、标准差为 1 的正态分布随机变量,然后对变量进行平方,然后将它们乘以 50000,最后加上 20000 来创建的。所以这些是我们确切知道的值。

然后,我使用“fitdistrplus”包中的 R 中的“fitdistcens”函数将对数正态分布和帕累托分布拟合到组合的审查和未经审查的数据中。然后我创建了 QQ 图、PP 图,并绘制了经验和理论 CDF 的比较,以评估分布的拟合优度。

当我查看上面提到的图时,我看到在 PP 图和 QQ 图中,有一个矩形来表示上面的所有 bin,除了 bin [20000, 100000] 之外。我想知道是否有人可以阐明这些经验分布的图形表示是如何构建的。

[QQ剧情][1]

library(fitdistrplus)

# Creating artificial censored data

left <- c(100,200,500,1000,2000,5000,10000,20000)
right <- c(200,500,1000,2000,5000,10000,20000,100000)
freqs <- c(5000,700,600,300,150,100,50,25)
df <- data.frame(left,right)

df_censored <- df[rep(seq_len(nrow(df)),times=freqs),]

# Create artificial uncensored data

left <- 20000 + 50000*rnorm(70)^2
right <- left

df_uncensored <- data.frame(left,right)

df_cens_and_uncens <- rbind(df_censored,df_uncensored)

dist_fit_lnorm <- fitdistcens(df_cens_and_uncens, "lnorm")

distr_to_plot <-list(lnorm = dist_fit_lnorm)

# plot function to compare empirical and fitted cdfs
cdfcompcens(distr_to_plot, xlim = c(0, 35000), plotstyle = "ggplot")

# pp plot for the different distribution to check goodness of fit
ppcompcens(distr_to_plot, plotstyle = "ggplot")

# qq plot for the different distribution to check goodness of fit
qqcompcens(distr_to_plot, plotstyle = "ggplot", xlim = c(0, 100000))

标签: rdistributionfitdistrplus

解决方案


推荐阅读