## Copyright (C) 2021 Marius Hofert, Ivan Kojadinovic, Martin Maechler, and Jun Yan
##
## This program is free software; you can redistribute it and/or modify it under
## the terms of the GNU General Public License as published by the Free Software
## Foundation; either version 3 of the License, or (at your option) any later
## version.
##
## This program is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
## FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
## details.
##
## You should have received a copy of the GNU General Public License along with
## this program; if not, see .
require(copula)
source(system.file("Rsource", "tstFit-fn.R", package="copula", mustWork=TRUE))
source(system.file("Rsource", "utils.R", package="copula", mustWork=TRUE))
##-> assertError(), assert.EQ(), ... showProc.time()
(doExtras <- copula:::doExtras())
uu <- array(c(9, 7, 8, 3, 2, 4, 1, 5, 6, 10,
6, 9, 1, 7, 3, 2, 5, 8, 4, 10), dim = c(10L, 2L)) / 11
suppressWarnings(RNGversion("3.5.0")) ## << FIXME: eliminate - adapting where needed below !
set.seed(7)
u3 <- cbind(uu, round(runif(10),2))
### t-copula instead of normal -- minimal set for testing here:
## d = 2
## fit1() here catches the error: "irho" not available for "tCopula":
(f1 <- fit1(tCopula(df.fixed=TRUE), x = uu))
stopifnot(identical(f1, fit1(tCopula(df.fixed=TRUE),
x = data.frame(uu))))# *WITH* a warning; keep data.frame() working!
## did not work with data.frame before 2012-08-12
## for df.fixed=FALSE, have 2 parameters ==> cannot use "fit1":
(f2.t <- fitCopula(tCopula(), uu, method="itau"))# (+ warning: ... 'df.fixed=TRUE' )
assertError( ## 14.Jan.2016: irho() has been "non-sense" -> now erronous:
fitCopula(tCopula(), uu, method="irho"), verbose=TRUE)
showProc.time()
if(doExtras) {
print(f2.m <- fitCopula(tCopula(), uu, method= "ml"))
print(f2.M <- fitCopula(tCopula(), uu, method= "mpl"))
print(summary(f2.m)) # gives SE for 'df' {from optim()}
print(summary(f2.M)) # no SE for 'df' (for now ..)
stopifnot(all.equal(coef(f2.m), coef(f2.M)))
showProc.time()
}
## d = 3 : -------------
## ok with df.fixed
tC3f <- tCopula(dim=3, dispstr="un", df.fixed=TRUE)
tC3 <- tCopula(dim=3, dispstr="un")
f3 <- fitCopula(tC3f, u3, method="itau")
f3.t <- fitCopula(tC3 , u3, method="itau") # warning: coercing to df.fixed=TRUE
summary(f3.t)
cf3 <- coef(f3, SE = TRUE)
stopifnot(all.equal(unname(cf3), cbind(c(0.374607, 0.309017, 0.374607),
c(0.386705, 0.325995, 0.405493)),
tol = 5e-5), # seen 6e-7
all.equal(coef(f3), coef(f3.t)))
if(FALSE) ## Error: iRho() method for class "tCopula" not yet implemented
(f3.r <- fitCopula(tC3, u3, method="irho"))
showProc.time()
octr <- list(trace=TRUE, REPORT=1, reltol = 1e-5)# less accurate than by default
if(doExtras) {
fitC.m <- function(C, data, method, ...)
fitCopula(C, data, method=method, optim.control=octr, traceOpt=TRUE, ...)
print(f3.m <- fitC.m(tC3, u3, method= "ml")); c.m <- coef(f3.m, SE=TRUE)
print(f3.M <- fitC.m(tC3, u3, method= "mpl")); c.M <- coef(f3.M, SE=TRUE)
showProc.time()
is.matrix(print(c.m))
is.character(SE <- "Std. Error")
stopifnot(all.equal(c.m[,1], c.M[,1]), # the estimates don't differ; the SE's do:
c.M[-4,SE] >= c.m[-4,SE],
c.m[, SE] > 0)
}
set.seed(17)
d <- 5 # dimension
nu <- 4 # degrees of freedom
## define and sample the copula, build pseudo-observations
ec4 <- tCopula(dim=d, df=nu, df.fixed=TRUE) # <- copula with param NA
(r <- iTau(ec4, tau <- c(0.2, 0.4, 0.6)))
P <- c(r[2], r[1], r[1], r[1], # upper triangle (w/o diagonal) of corr.matrix
r[1], r[1], r[1],
r[3], r[3],
r[3])
assertError( setTheta(ec4, value = P) )
validObject(ex4. <- setTheta(ec4, value = 0.8)) # set the only (non-fixed) parameter
## TODO "check" getTheta(ex4., ...)
## rather need "un" dispersion: Now with smarter tCopula():
(uc4 <- tCopula(dim=d, df=nu, disp = "un", df.fixed=FALSE))
validObject(uc4p <- setTheta(uc4, value = c(P, df=nu)))
U. <- pobs(rCopula(n=1000, copula=uc4p))
splom2(U.) # => now correct dependency
(cU <- cor(U., method="kendall")) # => correct:
stopifnot(cor(P, cU[lower.tri(cU)]) > 0.99)
## Fitting a t-copula with "itau.mpl" with disp="un"
(fm4u <- fitCopula(uc4, U., method="itau.mpl", traceOpt = TRUE))
## Fitting t-copulas ............. with disp = "ex" and "ar" :
uc4.ex <- tCopula(dim=d, df=nu, disp = "ex", df.fixed=FALSE)
uc4.ar <- tCopula(dim=d, df=nu, disp = "ar1", df.fixed=FALSE)
validObject(uc4p.ex <- setTheta(uc4.ex, value = c(0.75, df=nu)))
validObject(uc4p.ar <- setTheta(uc4.ar, value = c(0.75, df=nu)))
U.ex <- pobs(rCopula(n=1000, copula=uc4p.ex))
U.ar <- pobs(rCopula(n=1000, copula=uc4p.ar))
if(FALSE) { # The following are not available (yet); see ~/R/fitCopula.R
## Fitting a t-copula with "itau.mpl" with disp="ex"
(fm4e <- fitCopula(uc4.ex, U.ex, method="itau.mpl"))
## Fitting a t-copula with "itau.mpl" with disp="ar"
(fm4e <- fitCopula(uc4.ar, U.ar, method="itau.mpl"))
}
## Extra checks --------------------------------------------------------
if(doExtras) { ## Typically not run on R CMD check
tCop <- tCopula(c(0.2,0.4,0.6), dim=3, dispstr="un", df=5)
set.seed(101)
x <- rCopula(n=200, tCop) # "true" observations (simulated)
## Maximum likelihood (start = (rho[1:3], df))
print(summary(tc.ml <-
fitCopula(tCopula(dim=3, dispstr="un"), x, method="ml",
start=c(0,0,0, 10))))
print(summary(tc.ml. <-
fitCopula(tCopula(dim=3, dispstr="un"), x, method="ml")))# w/o 'start'
## Maximum pseudo-likelihood (the asymptotic variance cannot be estimated)
u <- pobs(x)
print(tc.mpl <- fitCopula(tCopula(dim=3, dispstr="un"),
u, method="mpl", estimate.variance=FALSE,
start= c(0,0,0,10)))
## Without 'start'
tc.mp. <- fitCopula(tCopula(dim=3, dispstr="un"), x, estimate.variance=FALSE)
print(tc.mp.)
noC <- function(x) { x@fitting.stats$counts <- NULL; x@call <- quote(dummy()); x }
assert.EQ(noC(tc.ml) , noC(tc.ml.), tol= .005) # nothing
assert.EQ(noC(tc.mpl), noC(tc.mp.), tol= .100, giveRE=TRUE) # shows diff
## The same t copula but with df.fixed=TRUE (=> use the same data!)
tC3u5 <- tCopula(dim=3, dispstr="un", df=5, df.fixed=TRUE)
## Maximum likelihood (start = rho[1:3])
print(tcF.ml <- fitCopula(tC3u5, x, method="ml", start=c(0,0,0)))
print(tcF.ml. <- fitCopula(tC3u5, x, method="ml")) # without 'start'
assert.EQ(noC(tcF.ml), noC(tcF.ml.), tol= 4e-4)
print(vcov(tcF.ml)) # the (estimated, asymptotic) var-cov matrix
## Maximum pseudo-likelihood (the asymptotic variance cannot be estimated)
print(tcF.mpl <- fitCopula(tC3u5, u, method="mpl", estimate.variance=FALSE,
start=c(0,0,0)))
print(tcF.mp. <- fitCopula(tC3u5, u, method="mpl", estimate.variance=FALSE))
assert.EQ(noC(tcF.mpl), noC(tcF.mp.), tol = 1e-5)
} # end Extras ----------------------------------------------------
## fitMvdc() -- first 2 D -- from Yiyun Shou's bug report: ---------------------
ct.2 <- tCopula(param=0.2, dim=2, dispstr = "ex", df.fixed=TRUE)
mvt.2.ne <- mvdc(copula = ct.2, margins = c("norm", "exp"),
paramMargins = list(list(mean = 0, sd = 2), list(rate = 2)))
mvt.2.ne ## --> four free parameters in total: rho, mean, sd, and rate:
getTheta(mvt.2.ne, attr = TRUE) # - shows only the copula parameter -- FIXME !
## simulate data and fit:
set.seed(17); x.samp <- rMvdc(250, mvt.2.ne)
fit2ne <- fitMvdc(x.samp, mvt.2.ne, start= c(1,1,1, rho = 0.5),
optim.control = list(trace = TRUE), hideWarnings=FALSE)
summary(fit2ne)
(confint(fit2ne) -> ci.2ne)
stopifnot(exprs = {
all.equal(coef(fit2ne),
c(m1.mean=0.061359521, m1.sd=2.0769423,
m2.rate=2.0437937, rho.1 = 0.15074002), tol=1e-7)# seen 1.48e-8
all.equal(c(ci.2ne),
c(-0.18309, 1.9064, 1.8019, 0.012286,
0.30581, 2.2474, 2.2857, 0.28919), tol = 4e-4) # seen 1.65e-5
})
### Fitting multivariate incl margins --- mvdc --------------------------------------
### ===========================================
set.seed(121)
gumbelC <- gumbelCopula(3, dim=2)
gMvGam <- mvdc(gumbelC, c("gamma","gamma"), param = list(list(2,3), list(4,1)))
gMvGam # now nicely show()s -- the *AUTO*-constructed parameter names
stopifnot(identical(gMvGam@paramMargins,
list(list(shape = 2, rate = 3),
list(shape = 4, rate = 1))))
X <- rMvdc(16000, gMvGam)
smoothScatter(X, main = "rMvdc(1600, gMvGam)")
persp (gMvGam, dMvdc, xlim = c(0,4), ylim=c(0,8)) ## almost discrete ????
contour(gMvGam, dMvdc, xlim = c(0,2), ylim=c(0,8))
points(X, pch = ".", cex = 2, col=adjustcolor("blue", 0.5))
if(doExtras) {
st <- system.time(
fMv <- fitMvdc(X, gMvGam, start = c(1,1,1,1, 1.3),# method="BFGS",
optim.control= list(trace=TRUE)))
print(st) # ~ 59 sec. (lynne 2015); ~ 47 sec (2020)
print(summary(fMv))
cfM <- coef(fMv, SE=TRUE)
print( all.equal(c(2,3, 4,1, 3), unname(cfM[,"Estimate"]))) # 0.01518
stopifnot(all.equal(c(2,3, 4,1, 3), unname(cfM[,"Estimate"]), tol = 0.02))
}
pFoo <- function(x, lower.tail=TRUE, log.p=FALSE)
pnorm((x - 5)/20, lower.tail=lower.tail, log.p=log.p)
dFoo <- function(x, lower.tail=TRUE, log.p=FALSE)
1/20* dnorm((x - 5)/20, lower.tail=lower.tail, log.p=log.p)
qFoo <- qunif # must exist; not used for fitting
## 'Foo' distribution has *no* parameters:
mv1 <- mvdc(gumbelC, c("gamma","Foo"), param= list(list(3,1), list()))
validObject(mv1)
stopifnot(nrow(R <- rMvdc(3, mv1)) == 3, ncol(R) == 2)
## a wrong way:
assertError(
mvW <- mvdc(gumbelC, c("gamma","Foo"), param= list(list(3,1), list(NULL)))
, verbose=TRUE)
## >> invalid class “mvdc” object: 'paramMargins[[2]]' must be named properly
showProc.time()
## An example which fails (and should)? --
## From: Suzanne Li @...queensu.ca, Date: Fri, 9 Aug 2013
gumbel <- archmCopula(family = "gumbel",dim = 2)
set.seed(47)# MM {not important, but still want sure reproducibility}
u <- cbind(runif(10),runif(10))
cor(u[,1], u[,2], method="kendall")
## [1] -0.02222222 -- slightly negative
## this now gives an error:
try(fgu <- fitCopula(gumbel, u, method = "ml"))
## Error in optim(start, loglikCopula, lower = lower, upper = upper, method = method, :
## non-finite finite-difference value [1]
## In addition: Warning message:
## In .local(copula, tau, ...) : tau is out of the range [0, 1]
copGumbel@paraInterval # -> [1, Inf) = exp([0, Inf))
length(par <- 2^c((0:32)/16, 2+(1:10)/8)) # 43
(t1 <- system.time(
llg <- sapply(par, function(p) loglikCopula(param=p, u=u, copula=gumbel))
))
(t2 <- system.time(
llg. <- loglikCopulaMany(par, u=u, copula=gumbel)
))
all.equal(llg, llg., tol=0)
if(dev.interactive()) plot(par, llg, type="b", col=2)
stopifnot(exprs = {
diff(llg) < 0 # so the maximum is for par = 2^0 = 1 --> at *boundary* of interval
all.equal(llg, llg., tol=4e-16) # see 0 diff (Lnx 64b)
})
## FIXME -- "ml" should return the boundary case, or a much better error message
## These work (with a warning {which is interesting, but maybe should not be a warning}
## "perfectly": They give the correct boundary case:
fg.itau <- fitCopula(gumbel, u, method = "itau")
fg.irho <- fitCopula(gumbel, u, method = "irho")
## Is it just this problem?
## well, the likelihood was not ok for large param=theta; now is:
lrgP <- 100*seq(8, 100, by = 3)
llrg <- vapply(lrgP, function(P) loglikCopula(param=P, u=u, copula=gumbel), NA_real_)
stopifnot(is.finite(llrg), diff(llrg) < 0, llrg < -11990)## no longer NaN
if(FALSE)
plot(lrgP, llrg, type="b", col=2) ## all fine
## Now is it because we *really* should use elme() and the "nacopula" families?
## No, this fails too: "outside interval" error {instead of just -Inf !}:
(copG <- onacopulaL("Gumbel", list(NaN,1:2)))
## Estimation -> error for now -- (FIXME!)
try(efm <- emle(u, copG))
## A simple example with *negative* correlation;
## Want *more helpful* error message here:
set.seed(7)
u1 <- seq(0,1, by=1/128)[2:127]; u2 <- -u1 + round(rnorm(u1)/4,2); u <- pobs(cbind(u1,u2))
plot(u)
msg <- tryCatch(fitCopula(gumbelCopula(), data = u), error=function(e)e$message)
## check error message __FIXME__ want "negative correlation not possible"
## or NO ERROR and a best fit to tau=0 [and the same for other Archimedean families!]
msg
showProc.time()
## Date: Sat, 14 Nov 2015 20:21:27 -0500
## Subject: Replace makePosDef() by nearPD()?
## From: Marius Hofert
## To: Ivan Kojadinovic , Jun Yan
## , Martin Maechler
## I currently face the problem of estimating a t-copula to a (504, 413)
## data matrix. A MWE is:
require(copula)
set.seed(271)
n <- 504
d <- 413
d <- 50 # more realistic -- should become faster !!
U <- matrix(runif(n*d), nrow=n, ncol=d)
if(FALSE) ## takes ??? (> one hour); *control = octr : some trace, not too accurate
system.time(fit <- fitCopula(ellipCopula("t", dim=d, dispstr="un"),
data=U, method="mpl", optim.control = octr))
## > Warning in makePosDef(sigma, delta = 0.001) :
## > Estimate is not positive-definite. Correction applied.
## > Process R killed: 9 at Sat Nov 14 19:48:55 2015
1
## ... so R crashes (this also happens if the data is much 'closer' to a
## t-copula than my data above, so that's not the problem). I'm wondering
## about the following.
showProc.time()
## 4) Implement: first estimating (via pairwise inversion of
## Kendall's tau) the dispersion matrix and then estimating the d.o.f.
## via MLE (based on the fitted dispersion matrix). Already in use in
## vignettes --- would be good to have this in the
## package as. What we could do is to extend
## fitCopula.icor(, method="kendall"): if the copula has a d.o.f. parameter, then don't
## treat it as fixed but estimated it via MLE... (or to get this behavior
## via a method argument or so?)
## 6) After 4), lambda() returns a vector of length 2* d(d-1)/2 ... ok
## in the bivariate case but not in higher dimensions => want a list
###----------- xvCopula() [ <--> ../man/xvCopula.Rd ] ---------
set.seed(12)
x <- rCopula(64, claytonCopula(pi))# "small" n ==> fast
fG <- fitCopula(gumbelCopula(), x)
(v <- c(logL = logLik(fG),
xv.loo = xvCopula(gumbelCopula(), x ), # l.o.o. CV
xv.5 = xvCopula(gumbelCopula(), x, k = 5)))# 5-fold CV
stopifnot(all.equal(unname(v), c(32.783677, 32.835744, 32.247463),
tolerance = 1e-7))
## now also with rotCopula: --
## NB: upper=NA / upper=Inf is *better* for optim(*, "L-BFGS-B") than upper= "Large" !!!
## --- (this is a puzzle in optim() itself !)
if(FALSE)# has been useful:
trace(copula:::fitCopula.ml,
trace = quote({cat("in fitCopula.ml(): copula=\n");print(copula)})
)
if(FALSE) ## explicit upper=Inf "works" (*not* finding very good value:
print(ff <- fitCopula(rotCopula(claytonCopula()), upper=NA, x, traceOpt=TRUE))
if(FALSE) ## explicit upper=Inf or =NA work; upper=100 "fails" giving bad result !
print(f1c <- fitCopula(rotCopula(claytonCopula()), upper=100, x, traceOpt=TRUE))
if(FALSE) ## "Brent" instead of default "L-BFGS-B" -- "works" very nicely with upper=100,
print(fB <- fitCopula(rotCopula(claytonCopula()), upper=100, x,
optim.method="Brent",traceOpt=TRUE))
## but *not* with upper=Inf or NA (--> error: .. must be finite..) or upper = 1e300 !!
try( fitCopula(rotCopula(claytonCopula()), upper=Inf, x, optim.method="Brent"))
try( fitCopula(rotCopula(claytonCopula()), upper=NA, x, optim.method="Brent"))
if(FALSE) ## very bad ('start' is not used with "Brent", but the upper bound is!)
print(fBL <- fitCopula(rotCopula(claytonCopula()), upper=1e300, x,
optim.method="Brent",traceOpt=TRUE))
## this "works" with 'Inf', but not with default --> upper = !
(xvR <- xvCopula(rotCopula(claytonCopula()), upper = Inf, x, k = 8, verbose=FALSE))
stopifnot(all.equal(xvR, 21.050569, tolerance = 1e-6))
## Now 'copula2 = indepCopula(..) gets 'dim = 3' from the first:
kh.C <- khoudrajiCopula(claytonCopula(2.5, dim=3), shapes = (1:3)/4)
kh.C
getTheta(kh.C, attr=TRUE) # bounds look good
x3 <- cbind(x, x[,1]^2 + runif(nrow(x)))
u3 <- pobs(x3)
if(FALSE) # Error: "non-finite finite-difference [3]"
xvK <- xvCopula(kh.C, u3, k = 8)
if(FALSE) # fails (same Error)
fK <- fitCopula(kh.C, u3)
## "works" :
p1 <- (1:20)/2
l1 <- sapply(p1, function(th1) loglikCopula(c(th1, (1:3)/4), u3, kh.C))
plot(p1, l1, type = "b") # nice maximum at around 6.xx
showProc.time()
## works two:
fixedParam(kh.C) <- c(FALSE, FALSE, TRUE,TRUE)
getTheta(kh.C)
summary(fK12 <- fitCopula(kh.C, u3))
fixedParam(kh.C) <- FALSE # all free now
fK4 <- fitCopula(kh.C, u3, start = c(coef(fK12), 0.3, 0.5),
optim.method = "L-BFGS-B", traceOpt=TRUE)
summary(fK4)
## -> shape1 ~= shape2 ~= 0
## dput(signif(unname(coef(fK4)), 8))
c4 <- c(4.4482535, 0, 0, 0.63730128)
all.equal(c4, unname(coef(fK4)), tol=0)# 7.342e-9
stopifnot(all.equal(c4, unname(coef(fK4)), tol=4e-8))
showProc.time()
kh.r.C <- khoudrajiCopula(rotCopula(claytonCopula(1.5)), shapes = c(1,3)/4)
u.krC <- rCopula(999, kh.r.C)
fm.krC <- fitCopula(copula = kh.r.C, data = u.krC, traceOpt=TRUE)# works (w/ warning)
xvK.R <- xvCopula(kh.r.C, u.krC, k = 10)
showProc.time()
## From: Ivan, 27 Jul 2016 08:58
set.seed(123)
u <- pobs(rCopula(300, joeCopula(4)))
fjc <- fitCopula(joeCopula(), data = u, method = "itau")
## Now a warning. Previously gave 'Error in dCor(cop) :'
## dTau() method for class "joeCopula" not yet implemented
summary(fjc)
all.equal(target = c(alpha = 4), coef(fjc))
fjcM <- fitCopula(joeCopula(), data = u, start = coef(fjc))
confint(fjcM)# 2.5 % 97.5 %
## alpha 3.077266 4.294797
summary(fjcM)
if(FALSE)
dput(signif(drop(coef(fjcM, SE=TRUE)), 4))
stopifnot(
all.equal(c(Estimate = 3.686, `Std. Error` = 0.31),
drop(coef(fjcM, SE=TRUE)), tol = 0.0002) # seen 0.000158
)
if(!doExtras) q(save="no") ## so the following auto prints
##--------------------------------------------------------------------------
## TODO: no longer use q() / quit() -- because it breaks 'covr'
## --- R-devel Q: How can we turn on auto-printing inside an if() { .. } clause via withVisible()?
## d = 2 :
## ----- catching fitCopula() error: 'Lapack routine dgesv: system is exactly singular: U[2,2] = 0'
##_FIXME_ since ca.end of 2015, this gives *different error*: iRho() not available for 'tCopula's'
rtx <- tstFit1cop(tCopula(df.fixed=TRUE), tau.set=c(.4, .8),
n.set= c(10, 25), N=64)
## for df.fixed=FALSE, have 2 parameters ==> cannot use "fit1":
## ....
## .... TODO
showProc.time()
## The other example with 'df' (fixed / free):
(tevc <- tevCopula(iTau(tevCopula(), 0.75))) ## rho.1 = 0.9751784, df = 4
set.seed(1); str(x <- rCopula(1000, tevc))
plot(x, main = "1000 samples of tevCopula(iTau(tevCopula(), 0.75))")
mirho <- fitCopula(tevCopula(), x, method="irho")# warning -> 'df.fixed=TRUE"
mitau <- fitCopula(tevCopula(df.fixed=TRUE), x, method="itau")# fine
cfR <- coef(mirho, SE=TRUE)
cfT <- coef(mitau, SE=TRUE)
stopifnot(
all.equal(0.97, cfR[[1]], tol=1e-4)# see 3.65e-5
)
system.time(
fmM. <- fitCopula(tevCopula(df.fixed=TRUE), x)# two warnings ==> do not estimate.var:
) # 23.5 sec -- the expensive part was trying get and invert the Hessian
system.time(
fmM <- fitCopula(tevCopula(df.fixed=TRUE), x, estimate.variance=FALSE)
) # 0.22 sec !!
stopifnot( all.equal(coef(fmM), coef(fmM.), tol=1e-15)) # even tol=0
system.time(
fML <- fitCopula(tevCopula(df.fixed=TRUE), x, method="ml")
)# 0.24 sec: very fast, too
showProc.time()
## 'df' is not estimated, but it should
## see above: tevCopula() is treated as tevCopula(df.fixed=TRUE))
system.time(
fM2 <- fitCopula(tevCopula(), x)# df as parameter, -- for var() kept at df = 2.53
) # 24s
system.time(
fM2. <- fitCopula(tevCopula(), x, estimate.variance=FALSE)
) # 0.44 sec
system.time(
fMm <- fitCopula(tevCopula(), x, method="ml")
) # 0.56
showProc.time()
c2 <- coef(fM2 , SE=TRUE)
c2. <- coef(fM2., SE=TRUE)
cm <- coef(fMm, SE=TRUE) ; cm # full
all.equal(c2[,1], c2.[,1], tol=0)
all.equal(c2[,1], cm [,1], tol=0)
stopifnot(exprs = {
## coef : 'rho'1' are the same
all.equal(c2[,1], c2.[,1], tol=1e-15)
all.equal(c2[,1], cm [,1], tol=1e-15)
all.equal(c(rho.1 = 0.96206, df = 2.5306), cm[,"Estimate"], tol=5e-5) # seen 5.62e-6
## Std.Error do differ: dput(signif(cm[,2], 4))
all.equal(c(rho.1 = 0.00663, df = 0.457), cm[,"Std. Error"], tol=0.002)# seen 0.0007
})
showProc.time()
set.seed(7)
system.time(# now works .. slowly!
rtevx <- tstFit1cop(tevCopula(, df.fixed=TRUE),
tau.set= c(.5, .75), n.set=c(10, 25), N=32)
)
## gives several "non-finite finite-difference {in optim()}
rtevx ## some NaN, NA
## for df.fixed=FALSE, have 2 parameters ==> cannot use "fit1":
## ....
## .... TODO
showProc.time()
data(rdj)
rdj <- rdj[,2:4]
splom2(rdj, cex=0.4, ## this gave an error for a day or so:
col.mat = matrix(adjustcolor("black", 0.5), nrow(rdj), 3))
dim(u <- pobs(rdj))# 1262 3
fc <- frankCopula(dim=3)
ffc <- fitCopula(fc, u) ## (failed in 0.999-4 {param constraints})
summary(ffc)
stopifnot(all.equal(2.866565, unname(coef(ffc)), tolerance = 1e-5))
showProc.time()