我估计正态逆高斯最大似然。
optim()
之后我得到
“错误 вintegra(f2, lower = 0, upper = Inf, z = z) :函数评估给出了错误长度的结果”。
有 bug 的代码部分是
f2 <- function (t, z) {
exp(-t)*t^(1-1/2)*(1+t/2*z)^(1-1/2)
}
int2 <- function (z) {
integrate(f2, lower=0, upper=Inf, z=z)$value
}
R网站上的类似推荐仍然有同样的错误:
int2 <- function (z) {
integrate(f2, lower=0, upper=Inf, z=z)
}
所以问题是如何根据 R 中的参数 z(不是数字而是符号)对 t 对 f2 进行积分?
完整代码如下
#NIG
library(stats)
unibubble_nig_ur <- function(x){
#mu
x1 <- x[1]
#nu
x2 <- x[2]
#alpha
x3 <- x[3]
#beta
x4 <- x[4]
#kappa
k <- x[5]
#sigma_sq
x6 <- x[6]
H <- log((x3^x4+t2^x4)/(x3^x4+t1^x4))
#mu_t
x7 <- x1+(x2-x2^2/2)*H*k
#alpha_t
x8 <- sqrt(1/((x6-x2^2*H))*k+1/4)
#beta_t
x9<--c(1/2)
#delta_t
x10 <- sqrt((x6-x2^2*H)/k)
zval <- x8*sqrt(x10^2+(yobs-x7^2))
f = function (t) exp(-t)*(1)^(t-1)
gamma = integrate(f, lower=0, upper=Inf)
#Bessel function of 2nd kind
f2 <- function (t, z) {
exp(-t)*t^(1-1/2)*(1+t/2*z)^(1-1/2)
}
int2 <- function (z) {
integrate(f2, lower=0, upper=Inf, z=z)$value
}
K1 <- exp(-zval)*sqrt(pi/2*zval)*int2(zval)/gamma
n <- length(logprice)
t1 <- seq(1, n-1)
t2 <- 1+t1
yobs <- diff(logprice,1)
# Probability Density Function
dnig <- x8*x10*exp(x10*sqrt(x8^2-x9^2)+x9*(yobs-x7))/(pi*sqrt(x10^2+(yobs-x7^2)))
loglklhd<--sum(log(dnig))
loglklhd
}
out_nig_ur <- optim(unibubble_nig_ur, p=c(60,40,80,80,80,80), hessian=TRUE)
out_nig_ur
例如:
F2 <- function(z){
f2 <- function(t){
exp(-t)*t^(1-1/2)*(1+t/2*z)^(1-1/2)
}
return(f2)
}
int2 <- function (z) {
integrate(F2(z), lower=0, upper=Inf)$value
}
> int2(1)
[1] 1.156935
如果
yobs
的长度大于 1,zval
也会大于 1,并且在 f2
行中调用 int2
时 K1 <- exp(-zval)*sqrt(pi/2*zval)*int2(zval)/gamma
的返回值也会大于 1,这会弄乱 integrate
。
要将 int2 应用于向量参数,您可以引入新函数
int2vec
并在公式中使用它代替 int2
:
int2vec<-function(t) sapply(t,int2)