我有两个人工生成的概率质量分布,彼此非常相似,除了一个是泊松分布,另一个是负二项式,其方差比泊松大。我使用下面的R代码示例生成它们,然后尝试使用nls或nlsLM函数重新估计初始输入参数值:
mkdir($path, 0777, true); // the true value here = recursively
对ggplot的调用将生成一对直方图,这些直方图显示出两个非常相似的离散概率质量分布:
这是运行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);
}
}
我的问题:我故意将两个示例构建为尽可能相似,那么为什么一个成功而另一个失败呢?
答案 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
其中nbstart2
与nbstart
相同,只是记录了起始参数。