使用" optim"在五个密度函数的联合密度的情况下

时间:2015-01-02 02:20:16

标签: r

我试图最大化一个包含五个密度的关节密度函数。所有密度都是正常的。但它给出了结果,其中参数的估计值是我在optim函数内给出的初始值。这是我的主要代码:

like<-function(y_11,y_12,y_13,y_14,y_15,Par){

BETA_01<-Par[1]

BETA_11<-Par[2]

SIGMA_BETA1<-Par[3]

SIGMA_1<-Par[4]

FI<-Par[5]



L<--prod(dnorm(y_11,BETA_01+BETA_11+rnorm(1,0,SIGMA_BETA1),SIGMA_1)*dnorm(y_12,BETA_01+2*BETA_11+rnorm(1,0,SIGMA_BETA1)+FI*y_11,sqrt((1-FI^2)*SIGMA_1))
*dnorm(y_13,BETA_01+3*BETA_11+rnorm(1,0,SIGMA_BETA1)+FI*y_12,sqrt((1-FI^2)*SIGMA_1))*dnorm(y_14,BETA_01+4*BETA_11+rnorm(1,0,SIGMA_BETA1)+FI*y_13,sqrt((1-FI^2)*SIGMA_1))*dnorm(y_15,BETA_01+5*BETA_11+rnorm(1,0,SIGMA_BETA1)+FI*y_14,sqrt((1-FI^2)*SIGMA_1)))

}


Max<-optim(c(0.05,0.95,0.95,0.96,0.45),like,y_11=y_11,y_12=y_12,y_13=y_13,y_14=y_14,y_15=y_15)

我检查了一个简单的,效果很好。这是:

Lik<-function(H,G,lam){

mu1<-lam[1]
sig1<-lam[2]
mu2<-lam[3]
sig2<-lam[4]

L<--prod(dnorm(H,mu1+mu2,sig1+sig2^2)*dnorm(G,mu2,sig2))

}

max<-optim(c(3,0.95,0.5,0.1),Lik,H=H,G=G)

有人可以帮助我吗?

我发现问题是什么,如果您的数据是从任何随机生成过程生成的,例如rnorm,rpois等,则optim函数会给出初始值作为参数估计值。但我不知道如何解决它。

1 个答案:

答案 0 :(得分:0)

optim的语法是

optim(par, fn, gr = NULL, ...,
      method = c("Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN", "Brent"),
      lower = -Inf, upper = Inf,
      control = list(), hessian = FALSE)

,帮助文件说

fn要最小化(或最大化)的函数,第一个参数是要进行最小化的参数向量。它应该返回一个标量结果。

因此,您应该将Par作为like函数中的第一个参数。

> like <- function(Par, y_11, y_12, y_13, y_14, y_15) {
+   BETA_01 <- Par[1]
+   BETA_11 <- Par[2]
+   SIGMA_BETA1 <- Par[3]
+   SIGMA_1 <- Par[4]
+   FI <- Par[5]
+   L <- -prod(dnorm(y_11, BETA_01 + BETA_11 + rnorm(1, 0, SIGMA_BETA1), SIGMA_1) * dnorm(y_12, BETA_01 + 2 * BETA_11 + rnorm(1, 0, SIGMA_BETA1) + FI * y_11, sqrt((1 - FI^2) * SIGMA_1)) * dnorm(y_13, BETA_01 + 3 * BETA_11 + rnorm(1, 0, SIGMA_BETA1) + FI * y_12, sqrt((1 - FI^2) * SIGMA_1)) * dnorm(y_14, BETA_01 + 4 * BETA_11 + rnorm(1, 0, SIGMA_BETA1) + FI * y_13, sqrt((1 - FI^2) * SIGMA_1)) * dnorm(y_15, BETA_01 + 5 * BETA_11 + rnorm(1, 0, SIGMA_BETA1) + FI * y_14, sqrt((1 - FI^2) * SIGMA_1)))
+   return(L)
+ }
> 
> y_11 <- 5
> y_12 <- 6
> y_13 <- 7
> y_14 <- 8
> y_15 <- 9
> 
> set.seed(1)
> Max <- optim(c(0.05, 0.95, 0.95, 0.96, 0.45), like, y_11 = y_11, y_12 = y_12, y_13 = y_13, y_14 = y_14, y_15 = y_15)
> Max
$par
[1] 0.0165776 0.9866576 0.9866576 0.9966576 0.4956336

$value
[1] -0.001973574

$counts
function gradient 
     501       NA 

$convergence
[1] 1

$message
NULL