0

100x2 データ フレーム DFN があります。fitdist列 DFN$Lret で実行すると、エラー メッセージ「関数 mle はエラー コード 100 でパラメーターを推定できませんでした」が表示されます。その理由は、最後の行に NA が含まれているためだと考えました。したがってfitdist、NA を除外して実行すると、「データは 1 より大きい長さの数値ベクトルでなければなりません」というエラーが表示されます。これを解決する方法について何か考えはありますか?どうもありがとう。

DFN <- structure(list(LRet = c(0.0011, 0, -0.0026, 0, -0.0015, 0.0038, 3e-04, -0.0021, 4e-04, -0.001, 0, 0.0019, -6e-04, -8e-04, -5e-04, -8e-04, 3e-04, -5e-04, -0.0026, 0.0014, 7e-04, 0, -2e-04, 0.0011, -0.0025, 0.0042, 0.0022, -0.0017, -0.0058, 1e-04, 2e-04, 8e-04, -9e-04, -0.0014, -0.0014, -0.001, -0.0032, -0.0015, 6e-04, -8e-04, 0.001, -0.0014, -0.0017, -8e-04, -0.001, 0.0011, 0.0013, -0.001, 5e-04, 9e-04, -8e-04, -0.0025, 0.0027, 6e-04, 2e-04, -6e-04, 9e-04, -3e-04, -7e-04, 3e-04, 0, 2e-04, -6e-04, 1e-04, -1e-04, -7e-04, -8e-04, 7e-04, -1e-04, -7e-04, 7e-04, 8e-04, -8e-04, 8e-04, 0.0058, -1e-04, -5e-04, 0.0027, -0.0012, 7e-04, 7e-04, 0, 3e-04, -1e-04, 2e-04, -2e-04, -0.0013, -1e-04, 1e-04, -0.0011, 0.0013, 2e-04, -3e-04, -7e-04, 0, 0.0015, 1e-04, 3e-04, -0.0012, NA), LRetPct = c("0.11%", "0.00%", "-0.26%", "0.00%", "-0.15%", "0.38%", "0.03%", "-0.21%", "0.04%", "-0.10%", "0.00%", "0.19%", "-0.06%", "-0.08%", "-0.05%", "-0.08%", "0.03%", "-0.05%", "-0.26%", "0.14%", "0.07%", "0.00%", "-0.02%", "0.11%", "-0.25%", "0.42%", "0.22%", "-0.17%", "-0.58%", "0.01%", "0.02%", "0.08%", "-0.09%", "-0.14%", "-0.14%", "-0.10%", "-0.32%", "-0.15%", "0.06%", "-0.08%", "0.10%", "-0.14%", "-0.17%", "-0.08%", "-0.10%", "0.11%", "0.13%", "-0.10%", "0.05%", "0.09%", "-0.08%", "-0.25%", "0.27%", "0.06%", "0.02%", "-0.06%", "0.09%", "-0.03%", "-0.07%", "0.03%", "0.00%", "0.02%", "-0.06%", "0.01%", "-0.01%", "-0.07%", "-0.08%", "0.07%", "-0.01%", "-0.07%", "0.07%", "0.08%", "-0.08%", "0.08%", "0.58%", "-0.01%", "-0.05%", "0.27%", "-0.12%", "0.07%", "0.07%", "0.00%", "0.03%", "-0.01%", "0.02%", "-0.02%", "-0.13%", "-0.01%", "0.01%", "-0.11%", "0.13%", "0.02%", "-0.03%", "-0.07%", "0.00%", "0.15%", "0.01%", "0.03%", "-0.12%", " NA%")), .Names = c("LRet", "LRetPct"), class = "data.frame", row.names = 901:1000)

library(fitdistrplus)

#Following gives error code 100
f1 <- fitdist(DFN$LRet,"norm") 

#Following gives error code 100
f1 <- fitdist(DFN$LRet,"norm", na.rm=T)

#Following gives error data must be a numeric vector of length greater than 1"
f1 <- fitdist(na.exclude(DFN$LRet),"norm")
#Same result using na.omit

NAを含む最後の行を削除すると、上記のコードは正常に機能することに注意してください。fitdist回避できる場合は、実行する前に最後の行を削除する必要はありません。

編集/更新: NA を使用して最後の行を削除すると、最初は問題が解決しましたが、現在は一貫して再現できていません (つまり、最後の行を削除した後、コードを数回正常に実行しましたが、常にではありません)。その理由を理解しようとしています。25x2 データ フレーム、100x2、300x2、およびベクターを使用してみましたが、同様の結果が得られました。データフレームまたはベクトルのサイズが問題の一部である可能性があると考えていたため、さまざまなサイズの試行が行われました。

4

2 に答える 2

6

fitdistショーによるデバッグ

 if (!(is.vector(data) & is.numeric(data) & length(data) > 1)) 
    stop("data must be a numeric vector of length greater than 1")

見て?is.vector

'is.vector' は、'x' が指定されたモードのベクトルで、 names 以外の属性を持たない場合に 'TRUE' を返します。

na.excludeおよびその親戚 (など)はna.omit、除外された値に関する情報を属性として保存するため、...is.vector()FALSE

の副作用の 1 つは、c()名前以外の属性を削除することis.vector(c(na.exclude(DFN$LRet)))ですTRUE

fitdist(c(na.exclude(DFN$LRet)), "norm")

少なくとも「数値ベクトルでなければならない」というエラーは表示されませんが、それでも「エラー 100」が表示されます。さらに調査中...

いくつかの内臓を掘り下げるとfitdist、(@ 42-が示唆するように)optim()問題が発生しているようです。具体的には、実際には答えにたどり着きますが、解のヘッセ行列を計算しようとすると、標準偏差パラメーターと barfs に負の値を試みます。

例として、これは機能します:

nn <- c(na.exclude(DFN$LRet))
fn <- function(x) -sum(dnorm(nn,mean=x[1],sd=x[2],log=TRUE))
optim(fn,par=c(mean(nn),sd(nn)),method="Nelder-Mead")

しかし、これは失敗します:

optim(fn,par=c(mean(nn),sd(nn)),method="Nelder-Mead",hessian=TRUE)
于 2016-05-07T18:23:14.943 に答える
4

(コードの記述が不十分なis.vectorセクションも見つかりましたが、エラーは解決されませんでした。)fitdist関数は、小さな分散のベクトルでは問題があるようです。

var( na.exclude(DFN$LRet))
[1] 2.220427e-06

これを回避するには、10 を掛けます。

> f1 <- fitdist(10*c(na.exclude(DFN$LRet)),"norm")
> f1
Fitting of the distribution ' norm ' by maximum likelihood 
Parameters:
          estimate  Std. Error
mean -0.0009090909 0.001490034
sd    0.0148256472 0.001032122

次に、標準確率理論を使用すると、これらの推定値を修正できます。つまり、平均を 10 で割り、分散を 100 (または sd を 10) で割ります。修正された結果からの推定fitdist値は、サンプル値にかなり近いです。

> all.equal( 0.0148256472/10 , sd(na.exclude(DFN$LRet) ) )
[1] "Mean relative difference: 0.005089095"
于 2016-05-07T18:35:16.713 に答える