首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >copularnd (copula随机数)函数中的Matlab线性相关矩阵

copularnd (copula随机数)函数中的Matlab线性相关矩阵
EN

Stack Overflow用户
提问于 2015-10-18 20:40:03
回答 1查看 330关注 0票数 0

假设我们有4个向量,V1V2nf1nf2。我们需要生成n=8736随机数,每对(V1,V2)(V1,nf1)(V2,nf2)(nf1,nf2)将按如下方式关联:

代码语言:javascript
复制
Rvv=0.6 for (V1,V2)
Rvn=0.5 for (V1,nf1) and (V2,nf2)
Rnn=0 for (nf1,nf2)

( (V1,nf2)(V2, nf1)之间的相关性并不重要)。现在我们使用copula在MATLAB中生成相关的随机数:

代码语言:javascript
复制
    Rvv=0.6;
    Rvn=0.5;
    Rnn=0;
    n = 8736;

            %V1     V2     nf1      nf2
    Rho =   [1      Rvv     Rvn     0  ;    %V1
            Rvv      1       0      Rvn;    %V2
            Rvn     0       1       Rnn;    %nf1
            0       Rvn     Rnn     1 ];    %nf2

    Random_no = copularnd('Gaussian',Rho,n);

Rvv0.6Random_no将是8736 by 4矩阵时,每对列都按照Rho矩阵的指定进行相关,这是可以接受的。但当为Rvv=0.9时,MATLAB返回的错误如下:

代码语言:javascript
复制
Error using mvnrnd
SIGMA must be a symmetric positive semi-definite matrix.
Error in copularnd 
u = normcdf(mvnrnd(zeros(1,d),Rho,n));

我不明白问题是什么,我怎么才能真正使用copula生成相关的随机数呢?如果有人能帮我解决这个问题,我将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2015-10-19 22:50:40

我不能回答关于理论的问题,但这是在copularnd的代码中得到的

代码语言:javascript
复制
case 'gaussian'
    Rho = varargin{1};
    n = varargin{2};
    d = size(Rho,1);
    if isscalar(Rho)
        if ~(-1 < Rho && Rho < 1)
            error(message('stats:copularnd:BadScalarCorrelation'));
        end
        Rho = [1 Rho; Rho 1];
        d = 2;
    elseif any(diag(Rho) ~= 1)
        error(message('stats:copularnd:BadCorrelationMatrix'));
    end
    % MVNRND will check that Rho is square, symmetric, and positive semi-definite.
    u = normcdf(mvnrnd(zeros(1,d),Rho,n));

因为在帮助中没有任何关于它的信息,所以我想它一定是对于知道copula是什么的人来说是明确的:)但不适合我

生成半正定矩阵的方法有很多:http://www.mathworks.com/matlabcentral/newsreader/view_thread/163489

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33198024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档