celestialgod

bivariate gamma

Mar 9th, 2016
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 1.25 KB | None | 0 0
  1. function Q = bivgmarnd(N, a1, b1, a2, b2, rho)
  2.  
  3. % X1 ~ Gamma(a1, b1),  X2 ~ Gamma(a2, b2),  X1 is independent of X2
  4. % Let Y1 = X1 + p * X2, Y2 = p * X1 + X2
  5. % E(Y1) = a1 * b1 + p * a2 * b2, E(Y2) = p*a1*b1 + a2*b2
  6. % Var(Y1) = Var(X1) + p^2 * Var(X2) = a1*b1^2+a2*(b2*p)^2
  7. % Var(Y2) = a1 * (p*b1)^2 + a2*b2^2
  8. % Cov(Y1, Y2) = Cov(X1 + p*X2, p*X1+X2) = p*Var(X1) + p*Var(X2) + 2*p*Cov(X1,X2)
  9. %   = p*a1*b1^2 + p*a2*b2^2  (Cov(X1,X2) = 0 because X1 is indep. of X2)  
  10. %
  11. % examples:
  12. % corr(bivgmarnd(1e6, 3, 2, 3, 1, 0.6))
  13. % % ans =
  14. % %     1.0000    0.6015
  15. % %     0.6015    1.0000
  16. % corr(bivgmarnd(1e6, 3, 2, 3, 1, 0.9))
  17. % % ans =
  18. % %     1.0000    0.9001
  19. % %     0.9001    1.0000
  20. % corr(bivgmarnd(1e6, 3, 2, 3, 1, -0.3))
  21. % % ans =
  22. % %     1.0000    -0.3016
  23. % %    -0.3016     1.0000
  24. syms p;
  25. p_ = double(solve((p*a1*b1^2 + p*a2*b2^2) / (sqrt(a1*b1^2+a2*(b2*p)^2) * sqrt(a1 * (p*b1)^2 + a2*b2^2)) == rho, p));
  26. rho_ = (p_*a1*b1^2 + p_*a2*b2^2) ./ (sqrt(a1*b1^2+a2*(b2*p_).^2) .* sqrt(a1 * (p_*b1).^2 + a2*b2^2));
  27. validate = find(abs(rho_ - rho) < 1e-3);
  28. if isempty(validate)
  29.   error('cannot find the real solution for (p1, p2)')
  30. else
  31.   p_ = p_(validate(1));
  32. end
  33.  
  34. X1 = gamrnd(a1, b1, N, 1);
  35. X2 = gamrnd(a2, b2, N, 1);
  36.  
  37. Q = [X1, X2] * [1, p_; p_, 1];
  38. end
Advertisement
Add Comment
Please, Sign In to add comment