我如何知道 R 中的数据分布?
How do I know what distribution of data follows in R?
我有以下数据框。
IN <- c(3.5, 5.75, 9, 13.25, 13, 9.5, 9.25, 6.75, 7, 4.25, 3.25, 1.75, 0)
OUT <- c(0.25, 2, 5.25, 8.5, 10.5, 11, 11.75, 9.25, 9.5, 7, 3.75, 4, 3.5)
dat <- data.frame(IN, OUT)
rownames(dat) <- c("10~11", "11~12", "12~13", "13~14", "14~15", "15~16", "16~17", "17~18", "18~19", "19~20", "20~21", "21~22", "22~23")
此数据是从上午 10:00 到 11:00 下午四天每小时在餐馆测量的平均人数。
我想分别知道IN和OUT数据的分布。我怎么知道 R 中的这个?否则,有没有好的方法通过R来分析这个?
您可以按如下方式使用 fitdistrplus 包:
library(fitdistrplus)
IN <- c(3.5, 5.75, 9, 13.25, 13, 9.5, 9.25, 6.75, 7, 4.25, 3.25, 1.75, 0)
OUT <- c(0.25, 2, 5.25, 8.5, 10.5, 11, 11.75, 9.25, 9.5, 7, 3.75, 4, 3.5)
dat <- data.frame(IN, OUT)
rownames(dat) <- c("10~11", "11~12", "12~13", "13~14", "14~15", "15~16",
"16~17", "17~18", "18~19", "19~20", "20~21", "21~22", "22~23")
# Obtain a Cullen and Frey graph
descdist(dat$IN, discrete = FALSE)
# Fit a distribution and inspect it
normal_distribution <- fitdist(dat$IN, "norm")
plot(normal_distribution)
fitdistrplus
包可以帮助解决这类问题,但您需要知道要检查哪些候选分布。让我们尝试正常、统一和指数:
library(fitdistrplus)
fit.in1 <- fitdist(dat$IN, "norm")
fit.in2 <- fitdist(dat$IN, "unif")
fit.in3 <- fitdist(dat$IN, "exp")
然后你可以绘制一些诊断图:
par(mfrow=c(2,2)
denscomp(list(fit.in1,fit.in2,fit.in3),legendtext=c("Normal","Uniform","Exponential"))
qqcomp(list(fit.in1,fit.in2,fit.in3),legendtext=c("Normal","Uniform","Exponential"))
cdfcomp(list(fit.in1,fit.in2,fit.in3),legendtext=c("Normal","Uniform","Exponential"))
ppcomp(list(fit.in1,fit.in2,fit.in3),legendtext=c("Normal","Uniform","Exponential"))
正常吗?也许:
> shapiro.test(dat$IN)
Shapiro-Wilk normality test
data: dat$IN
W = 0.96548, p-value = 0.8352
它在 [0,14] 上均匀吗?也许
> ks.test(dat$IN,"punif",0,14)
One-sample Kolmogorov-Smirnov test
data: dat$IN
D = 0.16758, p-value = 0.8024
alternative hypothesis: two-sided
这些检验的零假设是分布就是您认为的那样。另一种方法是分布不是您要测试的对象。因此,更小的 p 值意味着特定分布不是合适的候选者。
我有以下数据框。
IN <- c(3.5, 5.75, 9, 13.25, 13, 9.5, 9.25, 6.75, 7, 4.25, 3.25, 1.75, 0)
OUT <- c(0.25, 2, 5.25, 8.5, 10.5, 11, 11.75, 9.25, 9.5, 7, 3.75, 4, 3.5)
dat <- data.frame(IN, OUT)
rownames(dat) <- c("10~11", "11~12", "12~13", "13~14", "14~15", "15~16", "16~17", "17~18", "18~19", "19~20", "20~21", "21~22", "22~23")
此数据是从上午 10:00 到 11:00 下午四天每小时在餐馆测量的平均人数。
我想分别知道IN和OUT数据的分布。我怎么知道 R 中的这个?否则,有没有好的方法通过R来分析这个?
您可以按如下方式使用 fitdistrplus 包:
library(fitdistrplus)
IN <- c(3.5, 5.75, 9, 13.25, 13, 9.5, 9.25, 6.75, 7, 4.25, 3.25, 1.75, 0)
OUT <- c(0.25, 2, 5.25, 8.5, 10.5, 11, 11.75, 9.25, 9.5, 7, 3.75, 4, 3.5)
dat <- data.frame(IN, OUT)
rownames(dat) <- c("10~11", "11~12", "12~13", "13~14", "14~15", "15~16",
"16~17", "17~18", "18~19", "19~20", "20~21", "21~22", "22~23")
# Obtain a Cullen and Frey graph
descdist(dat$IN, discrete = FALSE)
# Fit a distribution and inspect it
normal_distribution <- fitdist(dat$IN, "norm")
plot(normal_distribution)
fitdistrplus
包可以帮助解决这类问题,但您需要知道要检查哪些候选分布。让我们尝试正常、统一和指数:
library(fitdistrplus)
fit.in1 <- fitdist(dat$IN, "norm")
fit.in2 <- fitdist(dat$IN, "unif")
fit.in3 <- fitdist(dat$IN, "exp")
然后你可以绘制一些诊断图:
par(mfrow=c(2,2)
denscomp(list(fit.in1,fit.in2,fit.in3),legendtext=c("Normal","Uniform","Exponential"))
qqcomp(list(fit.in1,fit.in2,fit.in3),legendtext=c("Normal","Uniform","Exponential"))
cdfcomp(list(fit.in1,fit.in2,fit.in3),legendtext=c("Normal","Uniform","Exponential"))
ppcomp(list(fit.in1,fit.in2,fit.in3),legendtext=c("Normal","Uniform","Exponential"))
正常吗?也许:
> shapiro.test(dat$IN)
Shapiro-Wilk normality test
data: dat$IN
W = 0.96548, p-value = 0.8352
它在 [0,14] 上均匀吗?也许
> ks.test(dat$IN,"punif",0,14)
One-sample Kolmogorov-Smirnov test
data: dat$IN
D = 0.16758, p-value = 0.8024
alternative hypothesis: two-sided
这些检验的零假设是分布就是您认为的那样。另一种方法是分布不是您要测试的对象。因此,更小的 p 值意味着特定分布不是合适的候选者。