데이터 세트가 있으며 내 데이터에 가장 적합한 분포를 찾고 싶습니다.
fitdistr()
함수를 사용하여 가정 된 분포를 설명하는 데 필요한 매개 변수를 추정했습니다 (예 : Weibull, Cauchy, Normal). 이러한 매개 변수를 사용하여 Kolmogorov-Smirnov 검정을 수행하여 표본 데이터가 가정 된 분포와 동일한 분포에서 추출되었는지 추정 할 수 있습니다.
p- 값이> 0.05이면 표본 데이터가 다음과 같다고 가정 할 수 있습니다. 동일한 분포에서 추출됩니다. 그러나 p- 값은 “적합의 신성에 대한 정보를 제공하지 않습니다.”
그러면 표본 데이터의 p- 값이 정규 분포와와 이블 분포에 대해> 0.05 인 경우 어떤 분포가 내 데이터에 더 잘 맞는지 어떻게 알 수 있습니까?
기본적으로 제가 한 일입니다.
> mydata [1] 37.50 46.79 48.30 46.04 43.40 39.25 38.49 49.51 40.38 36.98 40.00 [12] 38.49 37.74 47.92 44.53 44.91 44.91 40.00 41.51 47.92 36.98 43.40 [23] 42.26 41.89 38.87 43.02 39.25 40.38 42.64 36.98 44.15 44.91 43.40 [34] 49.81 38.87 40.00 52.45 53.13 47.92 52.45 44.91 29.54 27.13 35.60 [45] 45.34 43.37 54.15 42.77 42.88 44.26 27.14 39.31 24.80 16.62 30.30 [56] 36.39 28.60 28.53 35.84 31.10 34.55 52.65 48.81 43.42 52.49 38.00 [67] 38.65 34.54 37.70 38.11 43.05 29.95 32.48 24.63 35.33 41.34 # estimate shape and scale to perform KS-test for weibull distribution > fitdistr(mydata, "weibull") shape scale 6.4632971 43.2474500 ( 0.5800149) ( 0.8073102) # KS-test for weibull distribution > ks.test(mydata, "pweibull", scale=43.2474500, shape=6.4632971) One-sample Kolmogorov-Smirnov test data: mydata D = 0.0686, p-value = 0.8669 alternative hypothesis: two-sided # KS-test for normal distribution > ks.test(mydata, "pnorm", mean=mean(mydata), sd=sd(mydata)) One-sample Kolmogorov-Smirnov test data: mydata D = 0.0912, p-value = 0.5522 alternative hypothesis: two-sided
p- 값은 Weibull 분포의 경우 0.8669이고 정규 분포. 따라서 내 데이터가 Weibull 및 정규 분포를 따른다고 가정 할 수 있습니다. 그러나 어떤 분포 함수가 내 데이터를 더 잘 설명합니까?
elevendollar 를 참조하면 다음 코드를 찾았지만 결과를 해석하는 방법을 “모름 :
fits <- list(no = fitdistr(mydata, "normal"), we = fitdistr(mydata, "weibull")) sapply(fits, function(i) i$loglik) no we -259.6540 -257.9268
댓글
답변
먼저 몇 가지 간단한 설명이 있습니다.
- $ p $ -콜 모보 로프의 가치 -Smirnov-Test (KS-Test)는 예상 매개 변수를 사용하면 매우 잘못됩니다. 따라서 유감스럽게도 “분포를 피팅 한 다음 Kolmogorov-Smirnov-Test의 추정 매개 변수를 사용하여 샘플을 테스트 할 수는 없습니다.
- 샘플이 특정 항목을 따르지 않습니다 . 따라서 KS-Test의 $ p $ -값이 유효하고 $ > 0.05 $ 는 데이터가이 특정 분포를 따르는 지 배제 할 수 없음 을 의미합니다. 또 다른 공식은 샘플이 특정 분포와 호환된다는 것입니다. 하지만 " 데이터가 분포 xy를 정확히 따르나요? " 질문에 대한 대답은 항상 아니요 입니다.
- 여기서 목표는 샘플이 따르는 분포를 확실하게 결정하는 것이 아닙니다. 목표는 @whuber (댓글에서)가 데이터의 간략한 대략적인 설명 이라고 부르는 것입니다. 특정 매개 변수 분포를 갖는 것은 데이터의 모델로 유용 할 수 있습니다.
하지만 몇 가지 탐색을 해보겠습니다. 우수한 fitdistrplus
패키지는 분포 피팅을위한 멋진 기능을 제공합니다. descdist
함수를 사용하여 가능한 후보 배포에 대한 몇 가지 아이디어입니다.
library(fitdistrplus) library(logspline) x <- c(37.50,46.79,48.30,46.04,43.40,39.25,38.49,49.51,40.38,36.98,40.00, 38.49,37.74,47.92,44.53,44.91,44.91,40.00,41.51,47.92,36.98,43.40, 42.26,41.89,38.87,43.02,39.25,40.38,42.64,36.98,44.15,44.91,43.40, 49.81,38.87,40.00,52.45,53.13,47.92,52.45,44.91,29.54,27.13,35.60, 45.34,43.37,54.15,42.77,42.88,44.26,27.14,39.31,24.80,16.62,30.30, 36.39,28.60,28.53,35.84,31.10,34.55,52.65,48.81,43.42,52.49,38.00, 38.65,34.54,37.70,38.11,43.05,29.95,32.48,24.63,35.33,41.34)
이제 descdist
를 사용하겠습니다.
descdist(x, discrete = FALSE)
샘플의 첨도와 제곱 왜도는 " 관찰 ". 가능한 분포에는 Weibull, Lognormal 및 감마 분포가 포함되는 것 같습니다.
Let “s fit a Weibull 분포 및 정규 분포 :
fit.weibull <- fitdist(x, "weibull") fit.norm <- fitdist(x, "norm")
이제 정규 적합도를 검사합니다.
plot(fit.norm)
및 Weibull 맞춤 :
plot(fit.weibull)
div>
둘 다보기에는 좋지만 QQ-Plot으로 판단하면 Weibull은 특히 꼬리 부분이 좀 더 좋아 보일 수 있습니다. 이에 따라 Weibull 피팅의 AIC는 일반 피팅에 비해 낮습니다.
fit.weibull$aic [1] 519.8537 fit.norm$aic [1] 523.3079
Kolmogorov-Smirnov 테스트 시뮬레이션
여기 에 설명 된 @Aksakal “의 절차를 사용하여 null 아래 KS 통계를 시뮬레이션합니다.
n.sims <- 5e4 stats <- replicate(n.sims, { r <- rweibull(n = length(x) , shape= fit.weibull$estimate["shape"] , scale = fit.weibull$estimate["scale"] ) estfit.weibull <- fitdist(r, "weibull") # added to account for the estimated parameters as.numeric(ks.test(r , "pweibull" , shape= estfit.weibull$estimate["shape"] , scale = estfit.weibull$estimate["scale"])$statistic ) })
시뮬레이션 된 KS 통계의 ECDF는 다음과 같습니다.
plot(ecdf(stats), las = 1, main = "KS-test statistic simulation (CDF)", col = "darkorange", lwd = 1.7) grid()
마지막으로, 시뮬레이션 된 null 분포를 사용한 $ p $ -값 KS- 통계는 다음과 같습니다.
fit <- logspline(stats) 1 - plogspline(ks.test(x , "pweibull" , shape= fit.weibull$estimate["shape"] , scale = fit.weibull$estimate["scale"])$statistic , fit ) [1] 0.4889511
이것은 샘플이 Weibull 분포와 호환된다는 그래픽 결론을 확인합니다.
설명 된대로 여기 에서 부트 스트랩을 사용하여 예상 Weibull PDF 또는 CDF에 점별 신뢰 구간을 추가 할 수 있습니다.
xs <- seq(10, 65, len=500) true.weibull <- rweibull(1e6, shape= fit.weibull$estimate["shape"] , scale = fit.weibull$estimate["scale"]) boot.pdf <- sapply(1:1000, function(i) { xi <- sample(x, size=length(x), replace=TRUE) MLE.est <- suppressWarnings(fitdist(xi, distr="weibull")) dweibull(xs, shape=MLE.est$estimate["shape"], scale = MLE.est$estimate["scale"]) } ) boot.cdf <- sapply(1:1000, function(i) { xi <- sample(x, size=length(x), replace=TRUE) MLE.est <- suppressWarnings(fitdist(xi, distr="weibull")) pweibull(xs, shape= MLE.est$estimate["shape"], scale = MLE.est$estimate["scale"]) } ) #----------------------------------------------------------------------------- # Plot PDF #----------------------------------------------------------------------------- par(bg="white", las=1, cex=1.2) plot(xs, boot.pdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.pdf), xlab="x", ylab="Probability density") for(i in 2:ncol(boot.pdf)) lines(xs, boot.pdf[, i], col=rgb(.6, .6, .6, .1)) # Add pointwise confidence bands quants <- apply(boot.pdf, 1, quantile, c(0.025, 0.5, 0.975)) min.point <- apply(boot.pdf, 1, min, na.rm=TRUE) max.point <- apply(boot.pdf, 1, max, na.rm=TRUE) lines(xs, quants[1, ], col="red", lwd=1.5, lty=2) lines(xs, quants[3, ], col="red", lwd=1.5, lty=2) lines(xs, quants[2, ], col="darkred", lwd=2)
#----------------------------------------------------------------------------- # Plot CDF #----------------------------------------------------------------------------- par(bg="white", las=1, cex=1.2) plot(xs, boot.cdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.cdf), xlab="x", ylab="F(x)") for(i in 2:ncol(boot.cdf)) lines(xs, boot.cdf[, i], col=rgb(.6, .6, .6, .1)) # Add pointwise confidence bands quants <- apply(boot.cdf, 1, quantile, c(0.025, 0.5, 0.975)) min.point <- apply(boot.cdf, 1, min, na.rm=TRUE) max.point <- apply(boot.cdf, 1, max, na.rm=TRUE) lines(xs, quants[1, ], col="red", lwd=1.5, lty=2) lines(xs, quants[3, ], col="red", lwd=1.5, lty=2) lines(xs, quants[2, ], col="darkred", lwd=2) #lines(xs, min.point, col="purple") #lines(xs, max.point, col="purple")
GAMLSS를 사용한 자동 분포 피팅
gamlss
R
용 패키지는 다양한 배포를 시도하고 GAIC (일반화 된 Akaike 정보 기준)에 따라 " 최고입니다. 주요 기능은 fitDist
입니다. 이 함수에서 중요한 옵션은 시도되는 분포 유형입니다. 예를 들어, type = "realline"
를 설정하면 전체 실제 라인에 정의 된 모든 구현 된 배포를 시도하지만 type = "realsplus"
는 실제 양의 라인에 정의 된 배포 만 시도합니다. . 또 다른 중요한 옵션은 GAIC에 대한 벌칙 인 매개 변수 $ k $ 입니다. 아래 예에서는 $ k = 2 $ 매개 변수를 설정했습니다. 이는 " 최고 " 배포는 클래식 AIC에 따라 선택됩니다. $ k $ 를 원하는대로 설정할 수 있습니다 (예 : $ \ log (n) $ ). BIC.
library(gamlss) library(gamlss.dist) library(gamlss.add) x <- c(37.50,46.79,48.30,46.04,43.40,39.25,38.49,49.51,40.38,36.98,40.00, 38.49,37.74,47.92,44.53,44.91,44.91,40.00,41.51,47.92,36.98,43.40, 42.26,41.89,38.87,43.02,39.25,40.38,42.64,36.98,44.15,44.91,43.40, 49.81,38.87,40.00,52.45,53.13,47.92,52.45,44.91,29.54,27.13,35.60, 45.34,43.37,54.15,42.77,42.88,44.26,27.14,39.31,24.80,16.62,30.30, 36.39,28.60,28.53,35.84,31.10,34.55,52.65,48.81,43.42,52.49,38.00, 38.65,34.54,37.70,38.11,43.05,29.95,32.48,24.63,35.33,41.34) fit <- fitDist(x, k = 2, type = "realplus", trace = FALSE, try.gamlss = TRUE) summary(fit) ******************************************************************* Family: c("WEI2", "Weibull type 2") Call: gamlssML(formula = y, family = DIST[i], data = sys.parent()) Fitting method: "nlminb" Coefficient(s): Estimate Std. Error t value Pr(>|t|) eta.mu -24.3468041 2.2141197 -10.9962 < 2.22e-16 *** eta.sigma 1.8661380 0.0892799 20.9021 < 2.22e-16 ***
AIC에 따르면 Weibull 분포 (더 구체적으로는 WEI2
, 특수 매개 변수화) ) 데이터에 가장 적합합니다. 분포 WEI2
의 정확한 매개 변수화는 279 페이지의 이 문서 에 자세히 설명되어 있습니다. 웜 플롯 (기본적으로 de-trended QQ-plot)에서 잔차 확인 :
잔차는 중간 수평선에 가까워지고 나머지 95 %는 상단 사이에있을 것으로 예상됩니다. 95 % 포인트 별 신뢰 구간 역할을하는 아래쪽 점선 곡선입니다.이 경우 웜 플롯이 괜찮아 보이며 Weibull 분포가 적절하게 적합하다는 것을 나타냅니다.
Comments
- +1 좋은 분석입니다.하지만 한 가지 질문이 있습니다. 특정 주요 분포 (이 경우에는 Weibull)와의 호환성에 대한 긍정적 인 결론을 내리면 혼합 분포의 가능성을 배제 할 수 있습니다. '가 있습니까? 아니면 적절한 혼합물 분석을 수행하고 GoF를 확인하여 이 옵션을 배제 하시겠습니까?
- @AleksandrBlekh 혼합물을 배제 할 수있는 충분한 검정력을 갖는 것은 불가능합니다. 혼합물이 거의 동일한 두 분포 인 경우 감지 할 수없고 하나를 제외한 모든 구성 요소의 비율이 매우 작을 때 또한 감지 할 수 없습니다. 일반적으로 (분포 형태를 제안 할 수있는 이론이없는 경우) 데이터의 간략한 근사 설명 을 달성하기 위해 모수 분포에 적합합니다. 혼합물은 그런 것이 아닙니다. 매개 변수가 너무 많고 목적에 맞게 너무 유연합니다.
- @whuber : +1 훌륭한 설명에 감사드립니다!
- @Lourenco Cullen과 Fey 그래프를 살펴 보았습니다. 파란색 점은 샘플을 나타냅니다. 점이 Weibull, Lognormal 및 Gamma (와 이블과 감마 사이)의 선에 가깝다는 것을 알 수 있습니다. 각 분포를 피팅 한 후
gofstat
함수와 AIC를 사용하여 적합도 통계를 비교했습니다. ' " 최상의 " 분포를 결정하는 가장 좋은 방법에 대한 합의가 없습니다. 이다. 저는 그래픽 방식과 AIC를 좋아합니다. - @Lourenco 로그 노멀을 의미합니까? 로지스틱 분포 (" + " 기호)는 관측 된 데이터에서 상당히 떨어져 있습니다. 로그 노멀은 또한 내가 일반적으로 보는 ' 후보가 될 것입니다. 이 자습서에서는 게시물을 짧게 유지하기 위해 ' 표시하지 않기로 선택했습니다. 로그 정규 분포는 Weibull 분포와 정규 분포 모두에 비해 더 나쁜 적합치를 보여줍니다. AIC는 537.59이고 그래프도 ' 너무 좋아 보이지 않습니다.
답변
플롯은 데이터가 어떻게 생겼는지 더 잘 이해할 수있는 좋은 방법입니다. 귀하의 경우에는 fitdistr에서 얻은 매개 변수를 사용하여 이론적 cdfs에 대해 경험적 누적 분포 함수 (ecdf)를 플로팅하는 것이 좋습니다. ().
데이터에 대해 한 번 수행했으며 신뢰 구간도 포함했습니다. 다음은 ggplot2 ()를 사용하여 얻은 사진입니다.
검은 색 선은 경험적 누적 분포 함수입니다. 그리고 컬러 라인은 Maximum Likelihood 방법을 사용하여 얻은 매개 변수를 사용하여 다른 분포의 cdfs입니다. 선이 ecdf와 다른 형태를 가지고 있고 선이 ecdf에서 멀리 떨어져 있기 때문에 지수 및 정규 분포가 데이터에 적합하지 않다는 것을 쉽게 알 수 있습니다. 불행히도 다른 분포는 매우 가깝습니다. 그러나 나는 logNormal 선이 검은 선에 가장 가깝다고 말할 것입니다. 거리 측정 (예 : MSE)을 사용하여 가정을 검증 할 수 있습니다.
경쟁하는 분포가 두 개만있는 경우 (예 : 플롯에 가장 적합한 것으로 보이는 분포 선택) Likelihood-Ratio-Test 는 어떤 분포가 더 적합한 지 테스트합니다.
댓글
- CrossValidated에 오신 것을 환영합니다! (a) 그래픽을 생성하는 데 사용한 코드와 (b) 그래픽을 읽는 방법을 포함하도록 편집 할 수 있다면 대답이 더 유용 할 수 있습니다.
- 그곳에 무엇이 그려져 있습니까? 이것은 일종의 지수 도표인가요?
- 하지만 어떤 분포가 데이터에 가장 적합한 지 어떻게 결정합니까? 그래픽에 따르면 ' logNormal 또는 weibull이 데이터에 가장 적합한 지 여부를 알 수 없습니다.
- 의사 난수 생성기를 생성하려는 경우 이유 경험적 cdf를 사용하지 않습니까? 관찰 된 분포를 넘어서는 숫자를 그리시겠습니까?
- 그래프를 액면가로 가져 가면 후보 분포 중 아무것도 데이터에 전혀 적합하지 않은 것처럼 보입니다. 또한 ecdf에 0.03 미만의 수평 점근선이있는 것으로 보이므로 ' 이치에 맞지 않으므로 ' 확실하지 않습니다. 정말 처음에는 ecdf입니다.
I used the fitdistr() function
… .. '의fitdistr
기능은 무엇입니까? Excel의 기능입니까? 아니면 C로 직접 작성한 내용입니까?