找到Mathematica代码和R代码之间的差异来求解方程组

时间:2018-02-13 20:40:29

标签: r mathematica-8

我有这个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代码没有?

1 个答案:

答案 0 :(得分:1)

请注意,Mathematica给出的ap(因为我假设你假设混合分布)的值在理论上没有意义。

因此,由于您使用dbinom并且它不接受负概率,因此R找不到此解决方案。因此,似乎没有解决您的问题的方法。

相关问题