R 中的 GMM 具有正常 CDF 的积分
GMM in R with integral of normal CDF
我正在尝试 运行 GMM 估计,其中包括正常 CDF 的积分,其参数存在于函数和积分区间中。代码要点如下:
g1 <- function(b,x){
e <- b[1] +b[2]*x$x1
r <- e + b[3]*x$x2
n <- b[4]+b[5]*x$x3
ncdf <- function(z){
return((pnorm((log(z)-b[6]*log(e))/(b[7]/x$x4)))^n)
}
m1 <- x$y-integrate(ncdf,-Inf,r)/ncdf(r)
f <- cbind(m1)
return(f)
}
init = rep(0,7)
res<-gmm(g1,bids,init)
对于细微的变化,我得到
Error in integrate(ncdf, -Inf, r) : 'bound' must be of length one
或
Error in integrate(ncdf, -Inf, r) : a limit is NA or NaN
不胜感激。提前致谢。
所以我能够通过使用 Vectorize()
:
来解决它
g1 <- function(b,x){
e <- b[1] +b[2]*x$x1
r <- e + b[3]*x$x2
n <- b[4]+b[5]*x$x3
ncdf <- function(a,b,c,d){
return((pnorm((a-b)/c))^d)
}
intn <- function(z){
return(integrate(ncdf,-Inf,z,b=m,c=s,d=n)$value)
}
vint <- Vectorize(intn)
d <- b[6]*x$x6
s <- b[7]*x$x7
m1 <- x$y-vint(r)/ncdf(r,m,s,n)
f <- cbind(m1)
return(f)
}
我正在尝试 运行 GMM 估计,其中包括正常 CDF 的积分,其参数存在于函数和积分区间中。代码要点如下:
g1 <- function(b,x){
e <- b[1] +b[2]*x$x1
r <- e + b[3]*x$x2
n <- b[4]+b[5]*x$x3
ncdf <- function(z){
return((pnorm((log(z)-b[6]*log(e))/(b[7]/x$x4)))^n)
}
m1 <- x$y-integrate(ncdf,-Inf,r)/ncdf(r)
f <- cbind(m1)
return(f)
}
init = rep(0,7)
res<-gmm(g1,bids,init)
对于细微的变化,我得到
Error in integrate(ncdf, -Inf, r) : 'bound' must be of length one
或
Error in integrate(ncdf, -Inf, r) : a limit is NA or NaN
不胜感激。提前致谢。
所以我能够通过使用 Vectorize()
:
g1 <- function(b,x){
e <- b[1] +b[2]*x$x1
r <- e + b[3]*x$x2
n <- b[4]+b[5]*x$x3
ncdf <- function(a,b,c,d){
return((pnorm((a-b)/c))^d)
}
intn <- function(z){
return(integrate(ncdf,-Inf,z,b=m,c=s,d=n)$value)
}
vint <- Vectorize(intn)
d <- b[6]*x$x6
s <- b[7]*x$x7
m1 <- x$y-vint(r)/ncdf(r,m,s,n)
f <- cbind(m1)
return(f)
}