2016-05-07 13 views
0

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

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を実行する前に最後の行を排除する必要はありません。

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

+2

あなたが試すことが100 * DFN $ LRET [is.na(DFN $ LRET)!]。あなたの数値はゼロに非常に近いので、数値計算の問題を避けるために数値を再スケーリングする必要があります – aatrujillob

答えて

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 -resultsからの推定値はサンプル値にかなり近いです:

> all.equal(0.0148256472/10 , sd(na.exclude(DFN$LRet))) 
[1] "Mean relative difference: 0.005089095" 
6

デバッグ?is.vectorをみる

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

を示す:

'is.vector' 戻る 'TRUE' 'X' はない属性を持たない指定 モードのベクトルである場合名前以外の名前はです。

na.excludeとその親戚(na.omitなど)のでis.vector()FALSEなり、属性として除外値に関する情報を保存...

c()の副作用の一つは、名前以外の属性をドロップすることです、しかし、私はまだ「エラー100」を取得する - そうis.vector(c(na.exclude(DFN$LRet)))TRUEので、

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

は、少なくとも「でなければならない数値ベクトル」エラーを取得していません。さらに調査する...

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) 
関連する問題