Copules et dépendance (2)
By arthur charpentier on Friday, March 5 2010, 14:58 - Statistics - Permalink
Je poursuis le billet que j'avais commencé il y a quelque temps (ici) sur les copules. En effet, un étudiant me dit avoir utilisé "l'algorithme de Devroye" qui est donné comme exercice dans le livre de Roger Nelsen,

- Un algorithme de génération de la copule de Clayton

- Travail sur un algorithme faux, et tests d'ajustement
Considérons l'algorithme suivant, qui génère effectivement une distribution à marges dans [0,1], on se demande si la copule associé est, ou pas, la copule de Clayton (donc on prend les rangs)
> n=10000
> x1=rexp(n,1)
> x2=rexp(n,1)
> theta=1/2
> x=rgamma(n, shape=1, scale=theta)
> u1=(1+x1/x)^(-theta)
> u2=(1+x2/x)^(-theta)
> x1=rank(u1)/(n+1)
> x2=rank(u2)/(n+1)
> plot(x1,x2)
Vu de loin, cela ressemble à une copule de Clayton.

> beta.kernel.copula.surface <- function (u,v,bx,by,p) {
+ s <- seq(1/p, len=(p-1), by=1/p)
+ mat <- matrix(0,nrow = p-1, ncol = p-1)
+ for (i in 1:(p-1)) {
+ a <- s[i]
+ for (j in 1:(p-1)) {
+ b <- s[j]
+ mat[i,j] <- sum(dbeta(a,u/bx,(1-u)/bx) * dbeta(b,v/by,(1-v)/by)) / length(u)
+ } }
+ return(data.matrix(mat)) }
> Z= beta.kernel.copula.surface(x1,x2,bx=.1,by=.1,p=26)
> p=26
> u=seq(1/p, len=(p-1), by=1/p)
> persp(u,u,Z,theta=30,col="green",shade=TRUE)

> Z= beta.kernel.copula.surface(x1,x2,bx=.01,by=.01,p=26)

Bref, ça ressemble à du Clayton.... Si on regarde la section diagonale de la copule empirique, on note que l'on n'obtiens ni la copule de Clayton de paramètre 2, ni celle de paramètre 1/2,
> U=seq(.01,1,by=.01)> D=rep(NA,length(U))
> for(i in 1:length(U)){
+ D[i]=mean((x1<U[i])&(x2<U[i]))
+ }
> U=c(0,U)
> plot(U,c(0,D),cex=.5)
> lines(U,(2*U^(-1/theta)-1)^(-theta),col="red")
> lines(U,(2*U^(-theta)-1)^(-1/theta),col="blue")
Bref, ça ne semble pas correspondre à une des deux copules de Clayton recherchées,


définie comme
> for(i in 1:n){
+ V[i]=sum((x1<x1[i])&(x2<x2[i]))/(n-1)
+ }
> lambda=sort(V)-(1:n)/(n+1)
> plot(sort(V),lambda)
> u=seq(0,1,by=0.01)
> l=(u^(-theta)-1)/(-theta*u^(-theta-1))
> lines(u,l,col="blue")
> l=(u^(-1/theta)-1)/(-1/theta*u^(-1/theta-1))
> lines(u,l,col="red")

> U=seq(.01,1,by=.01)
> R=K=rep(NA,length(U))
> for(i in 1:length(U)){
+ I=(x1<U[i])&(x2<U[i])
+ R[i]=cor(x1[I],x2[I],method = "spearman")
+ K[i]=cor(x1[I],x2[I],method = "kendall")
+ }
> plot(U,R,cex=.75,type="b")
> abline(h=R[length(R)],col="green")

> abline(h=K[length(R)],col="purple")







