R中Rician分布参数的ML估计

时间:2011-07-10 21:14:33

标签: r curve-fitting

我将数据样本排列在1000 x 56阵列中,我想提取最适合每列数据的Rician分布参数。我正在使用VGAM包,这看起来非常合适,并在riceff

的文档中给出了示例
vee = exp(2); sigma = exp(1);
y = rrice(n <- 1000, vee, sigma)
fit = vglm(y ~ 1, riceff, trace=TRUE, crit="c")

我认为以下代码可以正常运行

nu <- rep(-1,ncol(data))
sigma <- rep(-1,ncol(data))

for( coln in seq(ncol(data)) ) {
  fdata <- c(data[,coln])
  fit <- vglm( fdata ~ 1, riceff, trace=TRUE, crit="c" )
  sigma[coln] <- matrix(Coef(fit)[1])[1,1]
  nu[coln] <- matrix(Coef(fit)[2])[1,1]
}

但我收到了错误

VGLM    linear loop  1 :  coefficients = -723936.834084,     598.301767
Error in if ((temp <- sum(wz[, 1:M, drop = FALSE] < wzepsilon))) warning(paste(temp,  : 
  argument is not interpretable as logical

对于我的数据,我运行了一些基本检查

> is.matrix(data)
[1] TRUE
> dim(data)
[1] 1000   56
> summary(data)
       V1           
 Min.   :1.402e-05  
 1st Qu.:9.533e-04  
 Median :1.548e-03  
 Mean   :1.640e-03  
 3rd Qu.:2.175e-03  
 Max.   :4.657e-03  

 ... (omitted for brevity)

      V56           
 Min.   :5.252e-05  
 1st Qu.:1.125e-03  
 Median :1.692e-03  
 Mean   :1.776e-03  
 3rd Qu.:2.293e-03  
 Max.   :5.903e-03

摘要中的所有信息都没有表明某处隐藏了NaN,因此我对vglm失败的原因感到茫然。

有没有人知道可能是什么问题?非常感谢任何见解。

1 个答案:

答案 0 :(得分:1)

正如Ben Bolker所建议的,这是我自己问题的“解决方案”(供将来参考):

vglm包中的VGAM函数不一定适用于所有数据输入。由于大量数据通常接近瑞利分布,因此该命令只是以奇怪的错误退出(Koay反转也失败了,出于类似的原因,我假设)。如果我通过genrayleigh将数据与广义Rayleigh分布拟合,那么一切都运行良好。

正如Ben建议的那样,尝试这两种方法的一种方法是使用trytryCatch来尝试两者,或在拟合函数出现故障时发出NA值。

tryCatch( {
  fit <- vglm( fdata ~ 1, riceff, trace=TRUE, crit="c" )
  # extract fit parameters here
  # ...
}, error = function(ex) {
  # insert NA value into your data here
  # ...
} )