为什么nls和nlsLM可以正确地工作以拟合Poisson分布,但是对于负二项式却失败?

时间:2019-01-11 05:39:40

标签: r curve-fitting nls

我有两个人工生成的概率质量分布,彼此非常相似,除了一个是泊松分布,另一个是负二项式,其方差比泊松大。我使用下面的R代码示例生成它们,然后尝试使用nls或nlsLM函数重新估计初始输入参数值:

mkdir($path, 0777, true); // the true value here = recursively

对ggplot的调用将生成一对直方图,这些直方图显示出两个非常相似的离散概率质量分布: Poisson distribution and negative binomial distribution

这是运行nlsLM的结果(nls也给出了非常相似的结果,但跟踪提供的信息略少):

if (file_exists($target_file)) {

    $matches = false;
    $pattern = "~(\d+)(:".$target_file."$)~";
    $data = file_get_contents('database.dat');
    preg_match($pattern, $data, $matches);

    if($matches) {
        $oldLine = $matches[0];
        $newLine = ($matches[1]+1).$matches[2];
        $newData = str_replace($oldLine, $newLine, $data);
        file_put_contents('database.dat', $newData, LOCK_EX);
    }

}

我的问题:我故意将两个示例构建为尽可能相似,那么为什么一个成功而另一个失败呢?

1 个答案:

答案 0 :(得分:2)

这是因为您被R中的默认参数顺序欺骗了。从pnbinom()的帮助页面中,我们看到pnbinom()具有以下语法:

  

pnbinom(q,大小,概率,mu,lower.tail = TRUE,log.p = FALSE)

您在通话中为pnbinom()提供了三个参数

nls(cdf ~ pnbinom(q, size, mu), data=nbdata, start=nbstart, trace=TRUE)

,即使您的参数称为 mu,它也是第三个参数,因此对应于prob中的pnbinom()。由于您使用的是替代格式,因此需要 name 名称以确保将其解释为mu。以下行按预期工作

> nbfit <- nls(cdf ~ pnbinom(q, size, mu=mu), data=nbdata, start=nbstart, trace=TRUE)
0.2185854 :  4 8
0.004568844 :  4.069641 9.972202
0.0001207377 :  4.921435 9.961606
3.952388e-05 :  5.068563 9.966108
3.948957e-05 :  5.071698 9.966222
3.948957e-05 :  5.071696 9.966224

如果nls()试图将大小设置为负数,则可能会遇到问题。可以通过对输入参数取幂来使其更稳定

> nbfit <- nls(cdf ~ pnbinom(q, exp(size), 
               mu=exp(mu)), data=nbdata, start=nbstart2, trace=TRUE)
0.2971457 :  3.688879 2.079442
0.2622977 :  0.4969337 2.1664490
0.00517649 :  1.408688 2.316948
6.196776e-05 :  1.610170 2.298254
3.948972e-05 :  1.623637 2.299200
3.948957e-05 :  1.623675 2.299202  

其中nbstart2nbstart相同,只是记录了起始参数。