2

私は、多くの夏の間、時間の経過とともにハエの累積的な出現に取り組んでいます(不規則な間隔で撮影されました)(ただし、最初は1年間の作業を試みています)。累積出現はシグモイド パターンに従い、3 パラメーターのワイブル累積分布関数の最尤推定を作成したいと考えています。fitdistrplusパッケージで使用しようとしている 3 パラメーター モデルでエラーが発生し続けます。これは私のデータがどのように構造化されているかに関係しているに違いないと思いますが、それを理解できません。明らかに、各ポイントをx(度日) およびy(emerge) 値ですが、2 つの列を読み取ることができないようです。私が得ている主なエラーは、「数学関数への非数値引数」または(わずかに異なるコードで)「データは1より大きい長さの数値ベクトルでなければなりません」と言います。以下は、df_dd_em有用な場合に備えて、累積的な出現とパーセントの出現のためにデータフレームに追加された列を含む私のコードです。

    degree_days <-   c(998.08,1039.66,1111.29,1165.89,1236.53,1293.71,
                      1347.66,1387.76,1445.47,1493.44,1553.23,1601.97,
                      1670.28,1737.29,1791.94,1849.20,1920.91,1967.25,
                      2036.64,2091.85,2152.89,2199.13,2199.13,2263.09,
                      2297.94,2352.39,2384.03,2442.44,2541.28,2663.90,
                      2707.36,2773.82,2816.39,2863.94)
    emergence <-  c(0,0,0,1,1,0,2,3,17,10,0,0,0,2,0,3,0,0,1,5,0,0,0,0,
                   0,0,0,0,1,0,0,0,0,0)
    cum_em <- cumsum(emergence)
    df_dd_em <- data.frame (degree_days, emergence, cum_em)
    df_dd_em$percent <- ave(df_dd_em$emergence, FUN = function(df_dd_em) 100*(df_dd_em)/46)
    df_dd_em$cum_per <- ave(df_dd_em$cum_em, FUN = function(df_dd_em) 100*(df_dd_em)/46)
    x <- pweibull(df_dd_em[c(1,3)],shape=5)
    dframe2.mle <- fitdist(x, "weibull",method='mle')
4

2 に答える 2

3

これがあなたが何を求めているかについての私の最善の推測です:

データの設定:

dd <- data.frame(degree_days=c(998.08,1039.66,1111.29,1165.89,1236.53,1293.71,
                      1347.66,1387.76,1445.47,1493.44,1553.23,1601.97,
                      1670.28,1737.29,1791.94,1849.20,1920.91,1967.25,
                      2036.64,2091.85,2152.89,2199.13,2199.13,2263.09,
                      2297.94,2352.39,2384.03,2442.44,2541.28,2663.90,
                      2707.36,2773.82,2816.39,2863.94),
                 emergence=c(0,0,0,1,1,0,2,3,17,10,0,0,0,2,0,3,0,0,1,5,0,0,0,0,
                 0,0,0,0,1,0,0,0,0,0))
dd <- transform(dd,cum_em=cumsum(emergence))

実際には、「間隔打ち切り」分布 (つまり、連続する度日観測間の出現確率: このバージョンでは、最初の観測が最初の度日観測のの観測を参照していると想定しています。参照するように変更できます)最後の観測のの観測まで)。

library(bbmle)
## y*log(p) allowing for 0/0 occurrences:
y_log_p <- function(y,p) ifelse(y==0 & p==0,0,y*log(p))
NLLfun <- function(scale,shape,x=dd$degree_days,y=dd$emergence) {
    prob <- pmax(diff(pweibull(c(-Inf,x),      ## or (c(x,Inf))
             shape=shape,scale=scale)),1e-6)
    ## multinomial probability
    -sum(y_log_p(y,prob))
}    
library(bbmle)

おそらく、モーメント法 (つまり、ワイブル分布の平均と分散をデータの平均と分散と一致させる) のようなもっと体系的なものを使用する必要がありましたが、妥当な開始値を見つけるために少しハッキングしただけです。

## preliminary look (method of moments would be better)
scvec <- 10^(seq(0,4,length=101))
plot(scvec,sapply(scvec,NLLfun,shape=1))

parscaleパラメータが非常に異なるスケールにあることを R に知らせるために使用することが重要です。

startvals <- list(scale=1000,shape=1)
m1 <- mle2(NLLfun,start=startvals,
     control=list(parscale=unlist(startvals)))

ここで、3 つのパラメータのワイブル (最初に要求されたとおり) を試してください。既存のものをわずかに変更するだけで済みます。

library(FAdist)
NLLfun2 <- function(scale,shape,thres,
                    x=dd$degree_days,y=dd$emergence) {
    prob <- pmax(diff(pweibull3(c(-Inf,x),shape=shape,scale=scale,thres)),
                 1e-6)
    ## multinomial probability
    -sum(y_log_p(y,prob))
}    
startvals2 <- list(scale=1000,shape=1,thres=100)
m2 <- mle2(NLLfun2,start=startvals2,
     control=list(parscale=unlist(startvals2)))

3 パラメーター フィットの方がはるかに優れているように見えます。

library(emdbook)
AICtab(m1,m2)
##    dAIC df
## m2  0.0 3 
## m1 21.7 2 

そして、ここにグラフィカルな要約があります:

with(dd,plot(cum_em~degree_days,cex=3))
with(as.list(coef(m1)),curve(sum(dd$emergence)*
                             pweibull(x,shape=shape,scale=scale),col=2,
                             add=TRUE))
with(as.list(coef(m2)),curve(sum(dd$emergence)*
                             pweibull3(x,shape=shape,
                                       scale=scale,thres=thres),col=4,
                             add=TRUE))

ここに画像の説明を入力

(これをよりエレガントに行うこともできggplot2ます...)

  • これらは見事に適合しているようには見えませんが、正気です。(値が少し低いかもしれませんが、原則として、間隔ごとの出現の予想数に基づいてカイ二乗適合度検定を実行し、3 パラメーター モデルを当てはめたという事実を説明することができます。 ...)
  • 当てはめの信頼区間は少し面倒です。あなたの選択は(1)ブートストラップです。(2) パラメトリック ブートストラップ (データの多変量正規分布を仮定してパラメーターをリサンプリングする); (3) デルタ法。
  • を使用bbmle::mle2すると、プロファイルの信頼区間の取得などを簡単に行うことができます。

 confint(m1)
 ##             2.5 %      97.5 %
 ## scale 1576.685652 1777.437283
 ## shape    4.223867    6.318481
于 2014-07-22T22:01:42.017 に答える
0
dd <- data.frame(degree_days=c(998.08,1039.66,1111.29,1165.89,1236.53,1293.71,
                           1347.66,1387.76,1445.47,1493.44,1553.23,1601.97,
                           1670.28,1737.29,1791.94,1849.20,1920.91,1967.25,
                           2036.64,2091.85,2152.89,2199.13,2199.13,2263.09,
                           2297.94,2352.39,2384.03,2442.44,2541.28,2663.90,
                           2707.36,2773.82,2816.39,2863.94),
             emergence=c(0,0,0,1,1,0,2,3,17,10,0,0,0,2,0,3,0,0,1,5,0,0,0,0,
                         0,0,0,0,1,0,0,0,0,0))

dd$cum_em <- cumsum(dd$emergence)

dd$percent <- ave(dd$emergence, FUN = function(dd) 100*(dd)/46)

dd$cum_per <- ave(dd$cum_em, FUN = function(dd) 100*(dd)/46)

dd <- transform(dd)


#start 3 parameter model

library(FAdist)

## y*log(p) allowing for 0/0 occurrences:

y_log_p <- function(y,p) ifelse(y==0 & p==0,0,y*log(p))

NLLfun2 <- function(scale,shape,thres,
                x=dd$degree_days,y=dd$percent) {
  prob <- pmax(diff(pweibull3(c(-Inf,x),shape=shape,scale=scale,thres)),
           1e-6)
   ## multinomial probability
  -sum(y_log_p(y,prob))
} 

startvals2 <- list(scale=1000,shape=1,thres=100)

m2 <- mle2(NLLfun2,start=startvals2,
       control=list(parscale=unlist(startvals2)))

summary(m2)

#graphical summary

windows(5,5)

with(dd,plot(cum_per~degree_days,cex=3))

with(as.list(coef(m2)),curve(sum(dd$percent)*
                           pweibull3(x,shape=shape,
                                     scale=scale,thres=thres),col=4,
                         add=TRUE))

ここに画像の説明を入力

于 2014-07-23T23:55:09.683 に答える