找到适合变量频率分布的适当分布

机器算法验证 r 分布 密度函数
2022-04-07 02:03:48

我正在尝试将分布拟合到我的数据集。例如,我有数据的频率分布如下所示。

在此处输入图像描述

以下是频率表,将数据划分为 10 个 bin。

  xvar lvar yvar
1     1   y1   25
2     2   y1   22
3     3   y1   16
4     4   y1   15
5     5   y1   10
6     6   y1    2
7     7   y1   NA
8     8   y1   NA
9     9   y1   NA
10   10   y1   NA
11    1   y2    2
12    2   y2    5
13    3   y2    8
14    4   y2   10
15    5   y2   15
16    6   y2    9
17    7   y2    6
18    8   y2    3
19    9   y2    2
20   10   y2    1
21    1   y3   NA
22    2   y3   NA
23    3   y3   NA
24    4   y3    6
25    5   y3   12
26    6   y3   14
27    7   y3   18
28    8   y3    6
29    9   y3    2
30   10   y3    1

yvar是每个 bin 中的频率。我想找到最适合这种趋势的相应分布(可能是 beta 分布或正态分布?)。我怎样才能做到这一点?

编辑

(1)我不需要完美契合,但要紧密契合,简单:一个常用的分布就足够了

(2)xvar是连续变量(如血压)或离散量表(例如 1:10 评分量表)

(3) 我相信大部分都可以用正态分布来描述,但我有一些像y1. 我想知道这些值可以通过 beta 分布来描述,但不知道如何找到合适的值(除了猜测之外)?

解决方案不一定需要在 中R,但以下是R上述数据集和绘图的代码。

y1 = c(25, 22,16, 15, 10,   2, NA, NA, NA, NA)
y2 = c(2, 5,8, 10, 15, 9, 6, 3, 2, 1) 
y3 = c(NA, NA,NA, 6, 12, 14, 18, 6, 2, 1)  

myd <- data.frame (xvar = 1:10, lvar = rep(c("y1", "y2", "y3"), each = 10),  yvar = c(y1, y2, y3)) 
library(ggplot2)
ggplot(myd, aes(x = xvar, y = yvar, fill = lvar, colour = lvar)) +  geom_point () + geom_line ()  + theme_bw() 
2个回答

在上述讨论中同意 Dmitry 和其他人的观点。我有以下可能有帮助的一般性评论。

我们可以确定拟合分布的 4 个步骤:

1)模型/函数选择:假设分布族;2)估计参数;3) 评估拟合质量;4) 拟合优度统计检验。

拟合分布的第一步是选择数学模型或函数以更好的方式表示数据。有时模型或函数的类型可以通过一些关于数据性质的假设来争论,通常直方图和其他图形技术可以在这一步中提供帮助(就像你绘制的一样),但是图形可能非常主观,所以有一些基于分析表达式,例如 Pearson 的 K 标准。求解一个特定的微分方程,我们可以获得几个能够代表所有经验分布的函数族。这些曲线仅取决于均值、可变性、偏度和峰度。

R 有几个可能有用的功能:

ad.test(): Anderson-Darling test for normality (nortest)
chisq.test(): chi-squared test (stats)
cut: divides the range of data vector into intervals
cvm.test(): Cramer-von Mises test for normality (nortest)
ecdf(): computes an empirical cumulative distribution function (stats)
fitdistr(): Maximum-likelihood fitting of univariate distributions (MASS)
goodfit(): fits a discrete (count data) distribution for goodness-of-fit tests (vcd)
hist(): computes a histogram of the given data values (stats)
jarque.bera.test(): Jarque-Bera test for normality (tseries)
ks.test(): Kolmogorov-Sminorv test (stats)
kurtosis(): returns value of kurtosis (fBasics)
lillie.test(): Lilliefors test for normality (nortest)
mle(): estimate parameters by the method of maximum likelihood (stats4)
pearson.test(): Pearson chi-square test for normality (nortest)
plot(): generic function for plotting of R objects (stats)
qqnorm(): produces a normal QQ plot (stats)
qqline(), qqplot(): produce a QQ plot of two datasets (stats)
sf.test(): test di Shapiro-Francia per la normalità (nortest)
shapiro.test():Shapiro-Francia test for normalità (stats)
skewness(): returns value of skewness (fBasics)
table(): builds a contingency table (stats)

有关拟合分布的详细信息,请阅读此内容。

首先,我需要说我同意@whuber 的观点,即仅仅用一些“常用分布”来解释数据可能不是最好的主意。一个好主意是找到底层模型并将其参数化。而且它根本不需要是一个分布。

但是,如果您的问题只是关于看起来与您的数据相似的分布,我会回答Gamma distribution它处理数据的非负性,并包含偏度。它有两个参数:kθ,可以用最大似然估计进行数值估计但是,您可以通过矩量法获得初始解决方案。在这里查看更多信息:http ://en.wikipedia.org/wiki/Gamma_distribution#Parameter_estimation

希望它对您的近期目标有所帮助,但请谨慎使用 :)