我有这个Mathematica代码试图解决一组方程式:
f[k_, n_, p_, a_, b_] :=p*(Binomial[n, k]*a^k*(1 - a)^(n - k)) + (1 - p)*Binomial[n, k]*b^k*(1 - b)^(n - k));
mom1 = Sum[k^1 *f[k, n, p, a, b], {k, 0, n}] - 3.3;
mom2 = Sum[k^2*f[k, n, p, a, b], {k, 0, n}] - 13.04;
mom3 = Sum[k^3*f[k, n, p, a, b], {k, 0, n}] - 58.08;
mom4 = Sum[k^4*f[k, n, p, a, b], {k, 0, n}] - 281.96;
estimate = NSolve[{mom1 == 0, mom2 == 0, mom3 == 0, mom4 == 0, n > 6}, {p, a, b, n}, Reals]
并给我以下输出:
{{p -> -0.0000925709, a -> -1.15159, b -> 0.343157, n -> 9.61271}}
我正在尝试使用R软件做同样的事情,使用以下代码:
init=c(0.2, 9, 0.2, 0.2);
GetMoment<-function(x, k, ord){
(k^ord)*DensityFn(x, k)
}
DensityFn<-function(x, k){
x[1]*dbinom(k, x[2], x[3])+(1-x[1])*dbinom(k, x[2], x[4])
}
target<-function(x){
y <- integer(4)
x[2]=floor(x[2]);
y[1]=sum(GetMoment(x, 0:x[2], 1))-3.3;
y[2]=sum(GetMoment(x, 0:x[2], 2))-13.04;
y[3]=sum(GetMoment(x, 0:x[2], 3))-58.08;
y[4]=sum(GetMoment(x, 0:x[2], 4))-281.96;
y
}
out=nleqslv(init, target);
print(out)
这些应该是等效的,但R输出给出了以下输出:
$x
[1] 0.2 9.0 0.2 0.2
$fvec
[1] -2.438 -24.314 -226.394 -2120.652
$termcd
[1] 6
$message
[1] "Jacobian is singular (1/condition=0.0e+000) (see allowSingular option)"
$scalex
[1] 1 1 1 1
$nfcnt
[1] 0
$njcnt
[1] 1
$iter
[1] 1
实际上是一样的吗?为什么Mathematica设法找到一个解决方案,而我的R代码没有?
答案 0 :(得分:1)
请注意,Mathematica给出的a
和p
(因为我假设你假设混合分布)的值在理论上没有意义。
因此,由于您使用dbinom
并且它不接受负概率,因此R找不到此解决方案。因此,似乎没有解决您的问题的方法。