将指数分布拟合到频率 table
Fitting exponential distribution to frequency table
我有以下数据集:
intervals <- c("0-10", "10-20", "20-30", "30-40", "40-50", "50-75", "75-100", ">100")
int.mean <- c(5.5, 14.3, 24.9, 35.4, 45.2, 63.1, 86.1, NA)
freq <- c(165, 90, 55, 25, 20, 35, 30, 15)
data <- data.frame(intervals, int.mean, freq)
我希望对数据进行指数分布拟合,以预测值超过 150 的概率并具有一定的置信度。我可以按如下方式拟合分布:
library(MASS)
fittedexp <- fitdistr(na.exclude(data$int.mean), "exponential")
然而,这并没有考虑到频率,所以我不确定我这样做是否正确。然后我计划使用 optim 函数来创建估计概率的置信区间。
您可以使用 freq
变量扩展数据,然后拟合分布
data.expand <- data[rep(seq_len(nrow(data)), times=data$freq), ]
head(data.expand, 3); tail(data.expand, 3)
intervals int.mean freq intervals int.mean freq
1 0-10 5.5 165 8.12 >100 NA 15
1.1 0-10 5.5 165 8.13 >100 NA 15
1.2 0-10 5.5 165 8.14 >100 NA 15
library(MASS)
with(subset(data.expand, subset=!is.na(int.mean)),
fitdistr(int.mean,densfun="exponential")
)
rate
0.041401745
(0.002020198)
您正在处理一个分类变量 "intervals",它根据您从中获取断点的假定基础连续变量创建离散的计数观察。有点混乱的数据情况。从技术上讲,您有 interval-censored 数据。 但是,如果您将指数分布作为假设,那么您计算的那些 "means" 实际上是中点,但它们不会是指数分布变量的均值。 见下文对于我对 int.means
观察结果的修改意见。 (所以现在我将扩展我的原始评论以包含一些 R 代码。)
如果我们将间隔的端点作为中断变量,并计算观察数据中的比例,我们有:
brks <- c(0, 10,20,30,40,50,75,100,Inf)
freq <- c(165, 90, 55, 25, 20, 35, 30, 15)
prop<- freq/sum(freq)
prop
#-----
[1] 0.37931034 0.20689655 0.12643678 0.05747126 0.04597701 0.08045977 0.06896552 0.03448276
round(prop,2)
[1] 0.38 0.21 0.13 0.06 0.05 0.08 0.07 0.03
然后我们可以显示具有相似均值的指数分布变量可能"look like"(就比例而言)如果分到这些区间:
table( findInterval( rexp(100, 1/15), brks) )/100
1 2 3 4 5 6 7
0.47 0.24 0.12 0.08 0.04 0.04 0.01
所以我们可能想尝试一个高于 15 的平均值,比如说 20?
> table( findInterval( rexp(100, 1/20), brks) )/100
1 2 3 4 5 6 7 8
0.37 0.24 0.13 0.09 0.07 0.07 0.02 0.01
> round(prop,2)
[1] 0.38 0.21 0.13 0.06 0.05 0.08 0.07 0.03
所以您可以很好地拟合观测值的低端,但指数分布的变量似乎有点 "thinner" 尾巴。由于您对数据的高端感兴趣,因此您可能希望在高端获得更好的拟合,但这会扰乱您的统计原则置信区间目标。你有点卡住了,因为你的数据不是一组正确的 "exponential" 观察值。 (将模拟大小增加到 1000 以减少噪声的影响。)
> table( findInterval( rexp(1000, 1/25), brks) )/1000
1 2 3 4 5 6 7 8
0.329 0.222 0.141 0.103 0.056 0.094 0.034 0.021
> round(prop,2)
[1] 0.38 0.21 0.13 0.06 0.05 0.08 0.07 0.03
那里的身材看起来并不糟糕。如果指数分布的速率参数是 1/25,那么这将是大于 150 的观测值的比例:
1-pexp(150, 1/25)
#[1] 0.002478752
可能有用:http://jsdajournal.springeropen.com/articles/10.1186/s40488-015-0028-6
您也可以尝试在 CrossValidated.com 上搜索存在一些先前讨论的地方。
编辑:我最初认为那些 int.means 值是间隔边界的中点,但显然不是这样,因为它们似乎接近中点但有很大的抖动围绕中点。此外,这些值与指数分布不一致,因为在人口最多的区间 (0-10) 中,观测值应该在中点的 "left" 处,甚至不在中点的左侧。它可能应该是 4.0 或 4.5,但肯定不会高到 5.5。它表明一些其他分布是这个物理过程的基础,也许是某种 Gamma 分布,它会在零附近下降到零,但在 0-10 间隔的早期达到峰值,然后有一个更长的尾巴。
我有以下数据集:
intervals <- c("0-10", "10-20", "20-30", "30-40", "40-50", "50-75", "75-100", ">100")
int.mean <- c(5.5, 14.3, 24.9, 35.4, 45.2, 63.1, 86.1, NA)
freq <- c(165, 90, 55, 25, 20, 35, 30, 15)
data <- data.frame(intervals, int.mean, freq)
我希望对数据进行指数分布拟合,以预测值超过 150 的概率并具有一定的置信度。我可以按如下方式拟合分布:
library(MASS)
fittedexp <- fitdistr(na.exclude(data$int.mean), "exponential")
然而,这并没有考虑到频率,所以我不确定我这样做是否正确。然后我计划使用 optim 函数来创建估计概率的置信区间。
您可以使用 freq
变量扩展数据,然后拟合分布
data.expand <- data[rep(seq_len(nrow(data)), times=data$freq), ]
head(data.expand, 3); tail(data.expand, 3)
intervals int.mean freq intervals int.mean freq
1 0-10 5.5 165 8.12 >100 NA 15
1.1 0-10 5.5 165 8.13 >100 NA 15
1.2 0-10 5.5 165 8.14 >100 NA 15
library(MASS)
with(subset(data.expand, subset=!is.na(int.mean)),
fitdistr(int.mean,densfun="exponential")
)
rate
0.041401745
(0.002020198)
您正在处理一个分类变量 "intervals",它根据您从中获取断点的假定基础连续变量创建离散的计数观察。有点混乱的数据情况。从技术上讲,您有 interval-censored 数据。 但是,如果您将指数分布作为假设,那么您计算的那些 "means" 实际上是中点,但它们不会是指数分布变量的均值。 见下文对于我对 int.means
观察结果的修改意见。 (所以现在我将扩展我的原始评论以包含一些 R 代码。)
如果我们将间隔的端点作为中断变量,并计算观察数据中的比例,我们有:
brks <- c(0, 10,20,30,40,50,75,100,Inf)
freq <- c(165, 90, 55, 25, 20, 35, 30, 15)
prop<- freq/sum(freq)
prop
#-----
[1] 0.37931034 0.20689655 0.12643678 0.05747126 0.04597701 0.08045977 0.06896552 0.03448276
round(prop,2)
[1] 0.38 0.21 0.13 0.06 0.05 0.08 0.07 0.03
然后我们可以显示具有相似均值的指数分布变量可能"look like"(就比例而言)如果分到这些区间:
table( findInterval( rexp(100, 1/15), brks) )/100
1 2 3 4 5 6 7
0.47 0.24 0.12 0.08 0.04 0.04 0.01
所以我们可能想尝试一个高于 15 的平均值,比如说 20?
> table( findInterval( rexp(100, 1/20), brks) )/100
1 2 3 4 5 6 7 8
0.37 0.24 0.13 0.09 0.07 0.07 0.02 0.01
> round(prop,2)
[1] 0.38 0.21 0.13 0.06 0.05 0.08 0.07 0.03
所以您可以很好地拟合观测值的低端,但指数分布的变量似乎有点 "thinner" 尾巴。由于您对数据的高端感兴趣,因此您可能希望在高端获得更好的拟合,但这会扰乱您的统计原则置信区间目标。你有点卡住了,因为你的数据不是一组正确的 "exponential" 观察值。 (将模拟大小增加到 1000 以减少噪声的影响。)
> table( findInterval( rexp(1000, 1/25), brks) )/1000
1 2 3 4 5 6 7 8
0.329 0.222 0.141 0.103 0.056 0.094 0.034 0.021
> round(prop,2)
[1] 0.38 0.21 0.13 0.06 0.05 0.08 0.07 0.03
那里的身材看起来并不糟糕。如果指数分布的速率参数是 1/25,那么这将是大于 150 的观测值的比例:
1-pexp(150, 1/25)
#[1] 0.002478752
可能有用:http://jsdajournal.springeropen.com/articles/10.1186/s40488-015-0028-6
您也可以尝试在 CrossValidated.com 上搜索存在一些先前讨论的地方。
编辑:我最初认为那些 int.means 值是间隔边界的中点,但显然不是这样,因为它们似乎接近中点但有很大的抖动围绕中点。此外,这些值与指数分布不一致,因为在人口最多的区间 (0-10) 中,观测值应该在中点的 "left" 处,甚至不在中点的左侧。它可能应该是 4.0 或 4.5,但肯定不会高到 5.5。它表明一些其他分布是这个物理过程的基础,也许是某种 Gamma 分布,它会在零附近下降到零,但在 0-10 间隔的早期达到峰值,然后有一个更长的尾巴。