我试图最大化一个包含五个密度的关节密度函数。所有密度都是正常的。但它给出了结果,其中参数的估计值是我在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函数会给出初始值作为参数估计值。但我不知道如何解决它。
答案 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