Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Cópulas: generar muestras correlacionadas

son funciones que describen las dependencias entre las variables y proporcionan una forma de crear distribuciones que modelan datos multivariados correlacionados.Cópulas Mediante una cópula, puede construir una distribución multivariada especificando distribuciones univariadas marginales y, a continuación, elegir una cópula para proporcionar una estructura de correlación entre las variables. Las distribuciones bivariadas, así como las distribuciones en dimensiones más altas, son posibles.

Determinar la dependencia entre las entradas de simulación

Una de las decisiones de diseño para una simulación Monte Carlo es una elección de distribuciones de probabilidad para las entradas aleatorias. La selección de una distribución para cada variable individual es a menudo sencilla, pero decidir qué dependencias deben existir entre las entradas puede no serlo. Idealmente, los datos de entrada a una simulación deben reflejar lo que sabe sobre la dependencia entre las cantidades reales que está modelando. Sin embargo, puede haber poca o ninguna información sobre la cual basar cualquier dependencia en la simulación. En tales casos, es útil experimentar con diferentes posibilidades para determinar la sensibilidad del modelo.

Puede ser difícil generar entradas aleatorias con dependencia cuando tienen distribuciones que no provienen de una distribución multivariada estándar. Además, algunas de las distribuciones multivariadas estándar solo pueden modelar tipos limitados de dependencia. Siempre es posible hacer que las entradas sean independientes, y si bien eso es una elección simple, no siempre es sensato y puede conducir a conclusiones equivocadas.

Por ejemplo, una simulación Monte-Carlo de riesgo financiero podría tener dos entradas aleatorias que representen diferentes fuentes de pérdidas de seguro. Puede modelar estas entradas como variables aleatorias lognormal. Una pregunta razonable es cómo la dependencia entre estas dos entradas afecta a los resultados de la simulación. De hecho, es posible que sepa de datos reales que las mismas condiciones aleatorias afectan a ambas fuentes; ignorando que en la simulación podría conducir a las conclusiones equivocadas.

Generar y Exponentiar variables aleatorias normales

La función simula variables aleatorias lognormal independientes.lognrnd En el ejemplo siguiente, la función genera pares de variables aleatorias normales independientes y, a continuación, los exponentida.mvnrndn Observe que la matriz de covarianza utilizada aquí es diagonal.

n = 1000;  sigma = .5; SigmaInd = sigma.^2 .* [1 0; 0 1]
SigmaInd = 2×2

    0.2500         0
         0    0.2500

 rng('default');  % For reproducibility ZInd = mvnrnd([0 0],SigmaInd,n); XInd = exp(ZInd);  plot(XInd(:,1),XInd(:,2),'.') axis([0 5 0 5]) axis equal xlabel('X1') ylabel('X2')

Las variables aleatorias de lognormal dependientes bivariadas también son fáciles de generar usando una matriz de covarianza con términos fuera de la diagonal distinto de cero.

rho = .7;   SigmaDep = sigma.^2 .* [1 rho; rho 1]  
SigmaDep = 2×2

    0.2500    0.1750
    0.1750    0.2500

 ZDep = mvnrnd([0 0],SigmaDep,n); XDep = exp(ZDep);

Un segundo gráfico de dispersión muestra la diferencia entre estas dos distribuciones bivariadas.

plot(XDep(:,1),XDep(:,2),'.') axis([0 5 0 5]) axis equal xlabel('X1') ylabel('X2')

Está claro que hay una tendencia en el segundo conjunto de datos para los valores grandes de ser asociado con valores grandes de, y de manera similar para los valores pequeños.X1X2 El parámetro de correlación

<math display="block">
<mrow>
<mi>ρ</mi>
</mrow>
</math>
de la normal bivariada subyacente determina esta dependencia. Las conclusiones extraídas de la simulación bien podrían depender de si se genera y con dependencia.X1X2 La distribución lognormal bivariada es una solución simple en este caso; se generaliza fácilmente a dimensiones superiores en los casos en que las distribuciones marginales son diferentes lognormals.

También existen otras distribuciones multivariadas. Por ejemplo, las distribuciones multivariadas y Dirichlet simulan variables dependientes y beta aleatorias, respectivamente.tt Pero la lista de distribuciones multivariadas simples no es larga, y sólo se aplican en casos donde los marginales están todos en la misma familia (o incluso las mismas distribuciones exactas). Esto puede ser una limitación seria en muchas situaciones.

La construcción de distribuciones bivariadas dependientes

Aunque la construcción discutida en la sección anterior crea un lognormal bivariado que es simple, sirve para ilustrar un método que es más generalmente aplicable.

  1. Genere pares de valores a partir de una distribución normal bivariada. Existe una dependencia estadística entre estas dos variables, y cada una tiene una distribución marginal normal.

  2. Aplicar una transformación (la función exponencial) por separado a cada variable, cambiando las distribuciones marginales en lognormals. Las variables transformadas todavía tienen una dependencia estadística.

Si se puede encontrar una transformación adecuada, este método se puede generalizar para crear vectores aleatorios bivariables dependientes con otras distribuciones marginales. De hecho, existe un método general de construcción de tal transformación, aunque no es tan simple como la exponenciación sola.

Por definición, aplicando la función de distribución acumulativa normal (CDF), denotado aquí por Φ, a una variable aleatoria normal estándar da como resultado una variable aleatoria que es uniforme en el intervalo [0,1]. Para ver esto, si tiene una distribución normal estándar, entonces la CDF de = Φ () esZUZ

Pr{Uu}=Pr{Φ(Z)u}=Pr(ZΦ1(u)}=u

y esa es la CDF de una variable aleatoria UNIF (0,1). Los histogramas de algunos valores simulados normales y transformados demuestran ese hecho:

n = 1000;  rng default % for reproducibility z = normrnd(0,1,n,1); % generate standard normal data  histogram(z,-3.75:.5:3.75,'FaceColor',[.8 .8 1]) % plot the histogram of data xlim([-4 4]) title('1000 Simulated N(0,1) Random Values') xlabel('Z') ylabel('Frequency')

u = normcdf(z);  % compute the cdf values of the sample data  figure histogram(u,.05:.1:.95,'FaceColor',[.8 .8 1]) % plot the histogram of the cdf values title('1000 Simulated N(0,1) Values Transformed to Unif(0,1)') xlabel('U') ylabel('Frequency')

Tomar prestado de la teoría de la generación de números aleatorios univariados, aplicando el CDF inverso de cualquier distribución, a una variable aleatoria UNIF (0,1) da como resultado una variable aleatoria cuya distribución es exactamente (ver).FFMétodos de inversión La prueba es esencialmente lo opuesto a la prueba precedente para el caso delantero. Otro histograma ilustra la transformación a una distribución gamma:

x = gaminv(u,2,1); % transform to gamma values  figure histogram(x,.25:.5:9.75,'FaceColor',[.8 .8 1]) % plot the histogram of gamma values title('1000 Simulated N(0,1) Values Transformed to Gamma(2,1)') xlabel('X') ylabel('Frequency')

Puede aplicar esta transformación de dos pasos a cada variable de una normal bivariada estándar, creando variables aleatorias dependientes con distribuciones marginales arbitrarias. Dado que la transformación funciona en cada componente por separado, las dos variables aleatorias resultantes no tienen ni siquiera las mismas distribuciones marginales. La transformación se define como:

Z=[Z1,Z2]N([0,0],[1ρρ1])U=[Φ(Z1),Φ(Z2)]X=[G1(U1),G2(U2)]

DóndeG1 YG2 son CDFS inversos de dos distribuciones posiblemente diferentes. Por ejemplo, lo siguiente genera vectores aleatorios a partir de una distribución bivariada cont5 y gamma (2, 1) marginales:

n = 1000; rho = .7; Z = mvnrnd([0 0],[1 rho; rho 1],n); U = normcdf(Z); X = [gaminv(U(:,1),2,1) tinv(U(:,2),5)];  % draw the scatter plot of data with histograms  figure scatterhist(X(:,1),X(:,2),'Direction','out')

Esta trama tiene histogramas junto a un gráfico de dispersión para mostrar tanto las distribuciones marginales, como la dependencia.

Utilizando coeficientes de correlación de rangos

El parámetro de correlación, de la normal bivariable subyacente determina la dependencia entre y en esta construcción.ρX1X2 Sin embargo, la correlación lineal de y no es.X1X2ρ Por ejemplo, en el caso lognormal original, un formulario cerrado para esa correlación es:

cor(X1,X2)=eρσ21eσ21

que es estrictamente menor que, a menos que sea exactamente 1.ρρ En casos más generales como la gamma/construcción, la correlación lineal entre y es difícil o imposible de expresar en términos de, pero las simulaciones muestran que el mismo efecto ocurre.tX1X2ρ

Esto se debe a que el coeficiente de correlación lineal expresa la dependencia lineal entre las variables aleatorias, y cuando las transformaciones no lineales se aplican a esas variables aleatorias, no se preserva la correlación lineal. En cambio, un coeficiente de correlación de rango, como el de Kendall o el de Spearman, es más apropiado.ρ

En términos generales, estas correlaciones de rango miden el grado en que los valores grandes o pequeños de una variable aleatoria se asocian con valores grandes o pequeños de otro. Sin embargo, a diferencia del coeficiente de correlación lineal, miden la asociación sólo en términos de rangos. Como consecuencia, la correlación de rangos se preserva bajo cualquier transformación monotónica. En particular, el método de transformación que acabamos de describir conserva la correlación de rangos. Por lo tanto, conocer la correlación de rango de la normal bivariada determina exactamente la correlación de rango de las variables aleatorias transformadas finales,.ZX Mientras que el coeficiente de correlación lineal,, todavía se necesita para parametrizar la normal bivariada subyacente, Kendall o Spearman's son más útiles en la descripción de la dependencia entre las variables aleatorias, porque son invariantes a la elección de marginal Distribución.ρτρ

Para la normalidad bivariada, hay un simple mapeo uno a uno entre Kendall o Spearman's, y el coeficiente de correlación lineal:τρρ

τ  = 2πarcsin(ρ)    or   ρ = sin(τπ2)  ρs = 6πarcsin(ρ2)  or   ρ = 2sin(ρsπ6)

La siguiente gráfica muestra la relación.

rho = -1:.01:1; tau = 2.*asin(rho)./pi; rho_s = 6.*asin(rho./2)./pi;  plot(rho,tau,'b-','LineWidth',2) hold on plot(rho,rho_s,'g-','LineWidth',2) plot([-1 1],[-1 1],'k:','LineWidth',2) axis([-1 1 -1 1]) xlabel('rho') ylabel('Rank correlation coefficient') legend('Kendall''s {\it\tau}', ...        'Spearman''s {\it\rho_s}', ...         'location','NW')

Por lo tanto, es fácil crear la correlación de rango deseada entre y, independientemente de sus distribuciones marginales, eligiendo el valor de parámetro correcto para la correlación lineal entre y.X1X2ρZ1Z2

Para la distribución normal multivariada, la correlación de rango de Spearman es casi idéntica a la correlación lineal. Sin embargo, esto no es cierto una vez que se transforma a las variables aleatorias finales.

El uso de copulas bivariate

El primer paso de la construcción descrita en la sección anterior define lo que se conoce como una copula gaussiana bivariada. Una cópula es una distribución de probabilidad multivariada, donde cada variable aleatoria tiene una distribución marginal uniforme en el intervalo de unidad [0,1]. Estas variables pueden ser completamente independientes, relacionadas de forma determinista (p. ej.,), o cualquier cosa en el medio.U2 = U1 Debido a la posibilidad de dependencia entre variables, puede utilizar una cópula para construir una nueva distribución multivariada para variables dependientes. Mediante la transformación de cada una de las variables en la cópula por separado utilizando el método de inversión, posiblemente utilizando diferentes CDFS, la distribución resultante puede tener distribuciones marginales arbitrarias. Estas distribuciones multivariadas son a menudo útiles en simulaciones, cuando se sabe que las diferentes entradas aleatorias no son independientes entre sí.

funciones de cómputo:Statistics and Machine Learning Toolbox™

  • Las funciones de densidad de probabilidad () y las funciones de distribución acumulativa () para cópulas gaussianacopulapdfcopulacdf

  • Clasificar correlaciones de correlaciones lineales () y viceversa ()copulastatcopulaparam

  • Vectores aleatorios ()copularnd

  • Parámetros para los cópulas aptos para los datos ()copulafit

Por ejemplo, utilice la función para crear parcelas de dispersión de valores aleatorios a partir de una cópula gaussiana bivariada para varios niveles, para ilustrar el rango de diferentes estructuras de dependencia.copularndρ La familia de cópulas Gaussianas bivariadas es parametrizada por la matriz de correlación lineal:

Ρ=(1ρρ1)

y acercarse a la dependencia lineal como enfoques ± 1, y acercarse a la independencia completa como ρ se aproxima a cero:U1U2ρ

n = 500;  rng('default') % for reproducibility U = copularnd('Gaussian',[1 .8; .8 1],n); subplot(2,2,1) plot(U(:,1),U(:,2),'.') title('{\it\rho} = 0.8') xlabel('U1') ylabel('U2')  U = copularnd('Gaussian',[1 .1; .1 1],n); subplot(2,2,2) plot(U(:,1),U(:,2),'.') title('{\it\rho} = 0.1') xlabel('U1') ylabel('U2')  U = copularnd('Gaussian',[1 -.1; -.1 1],n); subplot(2,2,3) plot(U(:,1),U(:,2),'.') title('{\it\rho} = -0.1') xlabel('U1') ylabel('U2')  U = copularnd('Gaussian',[1 -.8; -.8 1],n); subplot(2,2,4) plot(U(:,1),U(:,2),'.') title('{\it\rho} = -0.8') xlabel('U1') ylabel('U2') 

La dependencia entre y está completamente separada de las distribuciones marginales de y. y se puede dar cualquier distribución marginal, y todavía tienen la misma correlación de rango.U1U2X1 = G(U1)X2 = G(U2)X1X2 Este es uno de los principales atractivos de los cópulas, que permiten esta especificación separada de dependencia y distribución marginal. También puede calcular el pdf () y el CDF () para una cópula.copulapdfcopulacdf Por ejemplo, estas parcelas muestran el PDF y CDF para =. 8:ρ

u1 = linspace(1e-3,1-1e-3,50); u2 = linspace(1e-3,1-1e-3,50); [U1,U2] = meshgrid(u1,u2); Rho = [1 .8; .8 1]; f = copulapdf('t',[U1(:) U2(:)],Rho,5); f = reshape(f,size(U1));  figure() surf(u1,u2,log(f),'FaceColor','interp','EdgeColor','none') view([-15,20]) xlabel('U1') ylabel('U2') zlabel('Probability Density') 

u1 = linspace(1e-3,1-1e-3,50); u2 = linspace(1e-3,1-1e-3,50); [U1,U2] = meshgrid(u1,u2); F = copulacdf('t',[U1(:) U2(:)],Rho,5); F = reshape(F,size(U1));  figure() surf(u1,u2,F,'FaceColor','interp','EdgeColor','none') view([-15,20]) xlabel('U1') ylabel('U2') zlabel('Cumulative Probability') 

Se puede construir una familia diferente de cópulas partiendo de una distribución bivariada y transformándola utilizando la CDF correspondiente.tt La distribución bivariada se parametriza con la matriz de correlación lineal y los grados de libertad.tPν Así, por ejemplo, se puede hablar de unt1 o unt5 cópula, basada en la multivariante con uno y cinco grados de libertad, respectivamente.t

Al igual que para los cópulas Gaussianas, las funciones para el cómputo de cópulas:Statistics and Machine Learning Toolboxt

  • Las funciones de densidad de probabilidad () y las funciones de distribución acumulativa () para cópulas gaussianacopulapdfcopulacdf

  • Clasificar correlaciones de correlaciones lineales () y viceversa ()copulastatcopulaparam

  • Vectores aleatorios ()copularnd

  • Parámetros para los cópulas aptos para los datos ()copulafit

Por ejemplo, utilice la función para crear parcelas de dispersión de valores aleatorios a partir de una bivariadacopularndt1 cópula para varios niveles de, para ilustrar la gama de diferentes estructuras de dependencia:ρ

n = 500; nu = 1;  rng('default') % for reproducibility U = copularnd('t',[1 .8; .8 1],nu,n); subplot(2,2,1) plot(U(:,1),U(:,2),'.') title('{\it\rho} = 0.8') xlabel('U1') ylabel('U2')  U = copularnd('t',[1 .1; .1 1],nu,n); subplot(2,2,2) plot(U(:,1),U(:,2),'.') title('{\it\rho} = 0.1') xlabel('U1') ylabel('U2')  U = copularnd('t',[1 -.1; -.1 1],nu,n); subplot(2,2,3) plot(U(:,1),U(:,2),'.') title('{\it\rho} = -0.1') xlabel('U1') ylabel('U2')  U = copularnd('t',[1 -.8; -.8 1],nu, n); subplot(2,2,4) plot(U(:,1),U(:,2),'.') title('{\it\rho} = -0.8') xlabel('U1') ylabel('U2') 

Una cópula tiene distribuciones marginales uniformes para y, al igual que una cópula Gaussiana.tU1U2 La correlación de rangos oτρs entre los componentes de una cópula también es la misma función que para un gaussiano.tρ Sin embargo, como demuestran estas parcelas, unt1 cópula difiere bastante de una cópula gaussiana, incluso cuando sus componentes tienen la misma correlación de rango. La diferencia está en su estructura de dependencia. No es sorprendente, ya que el parámetro grados de libertad se hace más grande, unνtν cópula se aproxima a la cópula gaussiana correspondiente.

Al igual que con una cópula gaussiana, cualquier distribución marginal se puede imponer sobre una cópula.t Por ejemplo, utilizando una cópula con 1 grado de libertad, puede generar de nuevo vectores aleatorios a partir de una distribución bivariada con gamma (2, 1) ytt5 marginales que utilizan:copularnd

n = 1000; rho = .7; nu = 1;  rng('default') % for reproducibility U = copularnd('t',[1 rho; rho 1],nu,n); X = [gaminv(U(:,1),2,1) tinv(U(:,2),5)];  figure() scatterhist(X(:,1),X(:,2),'Direction','out') 

En comparación con la gamma bivariada/distribución construida anteriormente, que se basó en una copula gaussiana, la distribución construida aquí, basado en untt1 cópula, tiene las mismas distribuciones marginales y la misma correlación de rangos entre variables pero una estructura de dependencia muy diferente. Esto ilustra el hecho de que las distribuciones multivariadas no se definen de forma exclusiva por sus distribuciones marginales o por sus correlaciones. La elección de una cópula en particular en una aplicación puede basarse en datos reales observados, o diferentes cópulas pueden utilizarse como una forma de determinar la sensibilidad de los resultados de la simulación a la distribución de entrada.

Copulas de cota superior

La gaussiana y las cópulas son conocidas como cópulas elípticas.t Es fácil generalizar cópulas elípticas a un mayor número de dimensiones. Por ejemplo, simule datos de una distribución trivariada con gamma (2, 1), beta (2, 2) yt5 marginales que utilizan una cópula gaussiana y, como sigue:copularnd

n = 1000; Rho = [1 .4 .2; .4 1 -.8; .2 -.8 1]; rng('default') % for reproducibility U = copularnd('Gaussian',Rho,n); X = [gaminv(U(:,1),2,1) betainv(U(:,2),2,2) tinv(U(:,3),5)];

Graficar los datos.

subplot(1,1,1) plot3(X(:,1),X(:,2),X(:,3),'.') grid on view([-55, 15]) xlabel('X1') ylabel('X2') zlabel('X3')

Tenga en cuenta que la relación entre el parámetro de correlación lineal y, por ejemplo, Kendall, contiene para cada entrada en la matriz de correlación utilizada aquí.ρτP Puede verificar que las correlaciones de rangos de muestreo de los datos sean aproximadamente iguales a los valores teóricos:

tauTheoretical = 2.*asin(Rho)./pi
tauTheoretical = 3×3

    1.0000    0.2620    0.1282
    0.2620    1.0000   -0.5903
    0.1282   -0.5903    1.0000

tauSample = corr(X,'type','Kendall')
tauSample = 3×3

    1.0000    0.2581    0.1414
    0.2581    1.0000   -0.5790
    0.1414   -0.5790    1.0000

Archimedean copulas

funciones están disponibles para tres familias de cópula bivariada archimediana:Statistics and Machine Learning Toolbox

  • Clayton cópulas

  • Frank cópulas

  • Gumbel cópulas

Se trata de familias de un parámetro que se definen directamente en términos de sus CDFS, en lugar de definirse constructivamente utilizando una distribución multivariada estándar.

Para comparar estos tres cópulas Archimedean con las cópulas gaussiana y bivariada, utilice primero la función para encontrar la correlación de rangos para un gaussiano o cópula con un parámetro de correlación lineal de 0,8, y luego utilice la función para encontrar el parámetro de cópula de Clayton Tha t corresponde a esa correlación de rangos:tcopulastattcopulaparam

tau = copulastat('Gaussian',.8 ,'type','kendall')
tau = 0.5903 
alpha = copulaparam('Clayton',tau,'type','kendall')
alpha = 2.8820 

Finalmente, trazar una muestra aleatoria de la cópula de Clayton con.copularnd Repita el mismo procedimiento para las copulas de Frank y Gumbel:

n = 500;  U = copularnd('Clayton',alpha,n); subplot(3,1,1) plot(U(:,1),U(:,2),'.'); title(['Clayton Copula, {\it\alpha} = ',sprintf('%0.2f',alpha)]) xlabel('U1') ylabel('U2')  alpha = copulaparam('Frank',tau,'type','kendall'); U = copularnd('Frank',alpha,n); subplot(3,1,2) plot(U(:,1),U(:,2),'.') title(['Frank Copula, {\it\alpha} = ',sprintf('%0.2f',alpha)]) xlabel('U1') ylabel('U2')  alpha = copulaparam('Gumbel',tau,'type','kendall'); U = copularnd('Gumbel',alpha,n); subplot(3,1,3) plot(U(:,1),U(:,2),'.') title(['Gumbel Copula, {\it\alpha} = ',sprintf('%0.2f',alpha)]) xlabel('U1') ylabel('U2')

Simulación de datos multivariados dependientes mediante copulas

Para simular datos multivariados dependientes mediante una cópula, debe especificar cada uno de los siguientes elementos:

  • La familia de cópula (y cualquier parámetro de forma)

  • Las correlaciones de rango entre las variables

  • Las distribuciones marginales para cada variable

Supongamos que tiene datos de retorno para dos stocks y desea ejecutar una simulación de Monte Carlo con entradas que sigan las mismas distribuciones que los datos:

load stockreturns nobs = size(stocks,1);  subplot(2,1,1) histogram(stocks(:,1),10,'FaceColor',[.8 .8 1]) xlim([-3.5 3.5]) xlabel('X1') ylabel('Frequency')  subplot(2,1,2) histogram(stocks(:,2),10,'FaceColor',[.8 .8 1]) xlim([-3.5 3.5]) xlabel('X2') ylabel('Frequency')

Puede ajustar un modelo paramétrico por separado a cada DataSet y utilizar esas estimaciones como distribuciones marginales. Sin embargo, un modelo paramétrico puede no ser lo suficientemente flexible. En su lugar, puede utilizar un modelo no paramétrico para transformar las distribuciones marginales. Todo lo que se necesita es una manera de calcular la CDF inversa para el modelo no paramétrico.

El modelo no paramétrico más simple es el CDF empírico, calculado por la función.ecdf Para una distribución marginal discreta, esto es apropiado. Sin embargo, para una distribución continua, utilice un modelo que sea más suave que la función de paso calculada por.ecdf Una forma de hacerlo es estimar la CDF empírica e interpolar entre los puntos medios de los pasos con una función lineal a partes. Otra forma es utilizar el suavizado de kernel con.ksdensity Por ejemplo, compare el CDF empírico con una estimación de CDF suavizada del kernel para la primera variable:

[Fi,xi] = ecdf(stocks(:,1));  figure() stairs(xi,Fi,'b','LineWidth',2) hold on  Fi_sm = ksdensity(stocks(:,1),xi,'function','cdf','width',.15);  plot(xi,Fi_sm,'r-','LineWidth',1.5) xlabel('X1') ylabel('Cumulative Probability') legend('Empirical','Smoothed','Location','NW') grid on

Para la simulación, experimente con diferentes cópulas y correlaciones. Aquí, utilizaremos una cópula bivariada con un parámetro de grados de libertad bastante pequeño.t Para el parámetro de correlación, puede calcular la correlación de rangos de los datos.

nu = 5; tau = corr(stocks(:,1),stocks(:,2),'type','kendall')
tau = 0.5180 

Busque el parámetro de correlación lineal correspondiente para la cópula utilizando.tcopulaparam

rho = copulaparam('t', tau, nu, 'type','kendall')
rho = 0.7268 

A continuación, se utiliza para generar valores aleatorios a partir de la cópula y transformarse utilizando los CDFs inversos no paramétricos.copularndt La función le permite hacer una estimación del kernel de la distribución y evaluar el CDF inverso en los puntos de la cópula todo en un solo paso:ksdensity

n = 1000; U = copularnd('t',[1 rho; rho 1],nu,n);
X1 = ksdensity(stocks(:,1),U(:,1),...                'function','icdf','width',.15); X2 = ksdensity(stocks(:,2),U(:,2),...                'function','icdf','width',.15);

Alternativamente, cuando usted tiene una gran cantidad de datos o necesita simular más de un conjunto de valores, puede ser más eficiente calcular el CDF inverso sobre una rejilla de valores en el intervalo (0,1) y utilizar la interpolación para evaluarlo en los puntos de la cópula :

p = linspace(0.00001,0.99999,1000); G1 = ksdensity(stocks(:,1),p,'function','icdf','width',0.15); X1 = interp1(p,G1,U(:,1),'spline'); G2 = ksdensity(stocks(:,2),p,'function','icdf','width',0.15); X2 = interp1(p,G2,U(:,2),'spline');  scatterhist(X1,X2,'Direction','out')

Los histogramas marginales de los datos simulados son una versión suavizada de los histogramas de los datos originales. La cantidad de suavizado se controla mediante la entrada de ancho de banda.ksdensity

Adaptación de copulas a Data

Este ejemplo muestra cómo utilizar para calibrar cópulas con datos.copulafit Para generar datos con una distribución "al igual que" (en términos de distribuciones marginales y correlaciones) la distribución de datos en la matriz, es necesario ajustar las distribuciones marginales a las columnas de, utilizar las funciones de CDF apropiadas para transformarse, por lo que tiene valores entre 0 y 1, utilícelas para ajustarse a una cópula, generar nuevos datos a partir de la cópula y utilizar las funciones de CDF inversa apropiadas para transformarlas.XsimXXXUUcopulafitUUsimUsimXsim

Cargue y trace los datos de retorno de stock simulados.

load stockreturns x = stocks(:,1); y = stocks(:,2);  scatterhist(x,y,'Direction','out')

Transforme los datos en la escala de cópula (unidad cuadrada) utilizando un estimador de kernel de la función de distribución acumulativa.

u = ksdensity(x,x,'function','cdf'); v = ksdensity(y,y,'function','cdf');  scatterhist(u,v,'Direction','out') xlabel('u') ylabel('v')

Montar una copula.t

[Rho,nu] = copulafit('t',[u v],'Method','ApproximateML')
Rho = 2×2

    1.0000    0.7220
    0.7220    1.0000

nu = 2.6133e+06 

Genere una muestra aleatoria a partir de la cópula.t

r = copularnd('t',Rho,nu,1000); u1 = r(:,1); v1 = r(:,2);  scatterhist(u1,v1,'Direction','out') xlabel('u') ylabel('v') set(get(gca,'children'),'marker','.')

Transforme la muestra aleatoria de nuevo a la escala original de los datos.

x1 = ksdensity(x,u1,'function','icdf');  y1 = ksdensity(y,v1,'function','icdf');  scatterhist(x1,y1,'Direction','out') set(get(gca,'children'),'marker','.')

Como se ilustra en el ejemplo, los cópulas se integran naturalmente con otras funciones de ajuste de distribución.