-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcheckparam.R
82 lines (73 loc) · 2.52 KB
/
checkparam.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# Input:
# params: vector of parameters, for INFIGARCH (intercept, alpha, beta, d)
# for INHYGARCH (intercept, alpha, beta, d, tau)
# model: eiter "infigarch" or "inhygarch"
# Output:
# TRUE if all coefficients positive
# FLASE if at least one negative coefficient
checkparam <- function(params, model = c("infigarch", "inhygarch")){
if(length(model) == 2) model <- model[1]
if(length(params) != switch(model, infigarch = 4, inhygarch = 5)) stop("Parameter vector not suitable")
if(params[1] <= 0) return(F)
params <- params[-1]
if(model == "infigarch"){
phi <- params[1] + params[2]
alpha <- params[1]
beta <- params[2]
d <- params[3]
if(abs(beta) >= 1 | abs(phi) >= 1) return(F)
if(beta == phi) return(F)
psi <- INFIGARCH11coef(alpha = alpha, beta = beta, d = d, lagMax = 100)
if(any(psi < 0)) return(F)
f <- ((1:100) - 1 - d)/(1:100)
if(beta > 0){
if(psi[1] >= 0 & phi <= f[2]) return(T)
else{
kRel <- which((f[2:99] < phi)&(phi <= f[3:100])) + 2
if(length(kRel) == 0) return(F)
if(all(psi[kRel - 1] >= 0)) return(T)
}
return(F)
}
else{
if(psi[1] >= 0 & psi[2] >= 0 & phi <= f[2]*(beta + f[3])/(beta + f[2])) return(T)
else{
temp1 <- (f[2:98]*(beta + f[3:99])/(beta + f[2:98]) < phi)
kRel <- which(temp1&(phi <= f[3:99]*(beta + f[4:100])/(beta + f[3:99]))) + 3
if(length(kRel) == 0) return(F)
if(all(psi[kRel - 1] >= 0)) return(T)
return(F)
}
}
}
if(model == "inhygarch"){
phi <- params[1] + params[2]
alpha <- params[1]
beta <- params[2]
d <- params[3]
eta <- params[4]
if(beta == 0 | abs(beta) >= 1 | eta <= 0 | eta >= 1) return(F)
if(beta == phi) return(F)
psi <- INHYGARCH11coef(alpha = alpha, beta = beta, d = d, eta = eta, lagMax = 100)
if(any(psi < 0)) return(F)
f <- ((1:100) - 1 - d)/(1:100)
if(beta > 0){
if(psi[1] >= 0 & phi <= f[2]) return(T)
else{
kRel <- which((f[2:99] < phi)&(phi <= f[3:100])) + 2
if(length(kRel) == 0) return(F)
if(all(psi[kRel - 1] >= 0)) return(T)
return(F)
}
}
else{
if(psi[1]>= 0 & psi[2] >= 0 & abs(beta) <= f[2]) return(T)
else{
kRel <- which((f[2:99] < abs(beta)) & (abs(beta) <= f[3:100])) + 2
if(length(kRel) == 0) return(F)
if(!any(psi[1:(max(kRel) - 1)] < 0)) return(T)
return(F)
}
}
}
}