0

分布をフィッティングし、分布名、平均値、sd などで構成されるベクトルを返す関数があります。いくつかの分布をテストしていますが、考慮すべきゼロが多すぎると狂ってしまうため、gofstat() に頼ることはできません。 .

したがって、いくつかの変数の AIC を手動で比較し、どれが実際に「fitdist」クラスであるかを判断し、AIC が最も低い変数の名前を返す必要があります。それができたら、平均、標準偏差などを計算して返します。

コードは現在次のようになっています。

library(fitdistrplus)

fit_distr <- function(data){

fe <- tryCatch(fitdist(data, "exp"), error = function(e) FALSE )
flogis <- tryCatch(fitdist(data, "logis"), error = function(e) FALSE )
fn <- tryCatch(fitdist(data, "norm"), error = function(e) FALSE)
fp <- tryCatch(fitdist(data, "pois"), error = function(e) FALSE)
fg <- tryCatch(fitdist(data, "gamma"), error = function(e) FALSE)

classFitDist <- c(class(fe), class(flogis), class(fn), class(fp),class(fg))

distributions <- classFitDist == "fitdist"


AIC <- data.frame()
if(class(fe)=="fitdist") {AIC[1,ncol(AIC)+1] <- fe$aic}
if(class(flogis)=="fitdist") {AIC[1,ncol(AIC)+1] <- flogis$aic}
if(class(fn)=="fitdist") {AIC[1,ncol(AIC)+1] <- fn$aic}
if(class(fp)=="fitdist") {AIC[1,ncol(AIC)+1] <- fp$aic}
if(class(fg)=="fitdist") {AIC[1,ncol(AIC)+1] <- fg$aic}

names(AIC) <- c("exp", "logis", "norm", "pois", "gamma")[distributions]

fit <- names(AIC[which.min(AIC)])


mean <- switch (fit,
                          exp = 1/fe$estimate[[1]],
                          logis = flogis$estimate[[1]],
                          norm = fn$estimate[[1]],
                          pois = fp$estimate[[1]],
                          gamma = fg$estimate[[1]]/fg$estimate[[2]]
          )

sd <- switch (fit,
                        exp = mean,
                        logis = (flogis$estimate[[2]]*pi)/sqrt(3),
                        norm = fn$estimate[[2]],
                        pois = sqrt(mean),
                        gamma = sqrt(fg$estimate[[1]]/(fg$estimate[[2]]^2))
          )

return(c(fit,mean,sd))
}

それは機能しますが、考慮すべき数千のサンプルでは非常に遅くなります。それを最適化し、「よりクリーン」で高速にする方法の提案を歓迎します。

ところで、これは私が以前に持っていたものですが、前述したように、サンプルがあまりにも多くのゼロで構成されているため、適合していませんでした (しゃれは意図的ではありません!)

goodnessoffit <- gofstat(list(fe, flogis, fn, fp, fg)[distributions],  fitnames = c("exp", "logis", "norm", "pois","gamma")[distributions])
fit <- names(which(goodnessoffit$aic == min(goodnessoffit$aic)))

ans[!test & ok] のエラー <- rep(no, length.out = length(ans))[!test & : 置換の長さはゼロです

4

1 に答える 1