O erro está na definicao de Sigma, você fez os cálculos com variâncias marginais igual a 1 e segundo o "enunciado" essas variâncias são bem menores.


On 17/10/2016 17:05, Adriele Giaretta Biase via R-br wrote:

Olá pessoal,


tenho uma dúvida com relação à geração de variáveis aleatórias normais multivariadas no R.

Eu gostaria de gerar duas variáveis aleatórias (x1, x2) usando distribuição normal multivariada com estrutura de correlação entre elas. A Estrutura da matriz de correlação foi estimada antes com base num banco de dados reais (com correlação fraca de - 0.2). Porém, essas variáveis não podem ser negativas, Ex. x1 tem média e variância, respectivamente, iguais a 0.0067 e 0.0017; x2 tem média e variância, respectivamente, iguais a 0.1374 e 0.0024. Eu gero as variáveis da seguinte forma:



_Programa usado no R:_

# Simulando os parâmetros com estrutura de correlação entre eles

n <- 1000  # tamanho da amostra gerada

p <- 2  # numero de variáveis a serem geradas

library(MASS)

# construíndo a matriz de correlação para usar nas simulações, baseadas na característica da amostra coletada

mu<-rep(0, times = p)

rho <-   - 0.2             # correlacao negativa - 0.2

sigma2 <- 1

Sigma <- sigma2 * ((1-rho)*diag(p)+rho*matrix(1, p, p))

X1 <- 0.0096  # Media da variavel x1

X2 <- 0.1203 # Media da variavel x2

media <- c(X1,X2)

y  <-  mvrnorm(n, media, Sigma)

cor(y)

apply(y, 2, mean)

y


 [1,]  0.309910452  1.0642521083

 [2,] -0.251583312  1.8909032058

 [3,]  1.330362012 -1.1239501814

 [4,] -0.793399464 -1.5433056284

 [5,]  2.165144843 -0.2645184534

 [6,]  0.532777085  1.0910864562

 [7,] -1.612135390  2.0489354648

 [8,] -0.430529913  1.0312062602

...

Quando gero as simulações para x1 e x2 usando a função /mvrnorm/, o resultado me retorna alguns valores negativos para as variáveis, isso não poderia ocorrer. Teria alguma outra função em que eu possa fornecer a variância de cada uma dessas variáveis, além da estrutura de correlação? Como poderia contornar essa situação, usando o R?

*_Obs:_*No SAS, a seguinte programação funciona perfeitamente:


*proc**iml*;

wrksize=*100000*;

K=*2*;

N=*1000*; /* tamanho da amostra */

M={*0**0*};

S={ *1*     -*0.5283*,

-*0.5283**1*};

X=shape(*0*,K,N);

ME=*0*; SI=*1*;

DOI=*1*TOK;

DOJ=*1*TON;

ifI>*1*

then

        do;

ME=M[I]+(S[*1*:I-*1*,I])`*(inv(S[*1*:I-*1*,*1*:I-*1*])*(X[*1*:I-*1*,J]-M[*1*:I-*1*]));

SI=S[I,I]-(S[*1*:I-*1*,I])`*(inv(S[*1*:I-*1*,*1*:I-*1*])*(S[*1*:I-*1*,I]));

end;

X[I,J]=ME+NORMAL(*0*)*SQRT(SI);

END;

END;

Z=t(X);

varnames='X1':'X2';

createNOVO fromZ[colname=varnames];

appendfromZ;

*quit*;

*data*MEXT; setNOVO;

optionsps=*66*ls=*75*;

   X1=*0.0067*+*0.0017**X1; /* normal */

X2=*0.1374*+*0.0024**X2; /* normal */

*proc**corr*data=MEXT;

varX1 X2;

*run*;


--
Adriele Giaretta Biase.
Mestre em  Estatística e Experimentação Agropecuária - UFLA.
Doutora em Estatística e Experimentação Agronômica - ESALQ/ USP
Contato: (19) 98861-0619.


_______________________________________________
R-br mailing list
R-br@listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a c�digo 
m�nimo reproduz�vel.

_______________________________________________
R-br mailing list
R-br@listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a c�digo 
m�nimo reproduz�vel.

Responder a