matlab中,有一组二维数据,如何绘制三维的联合经验分布函数图

如果是一维数据X,就能直接用[f,x] = ecdf(X)来绘制经验分布函数图,但如果是二维的数据数据[X,Y],要如何绘制二维数据的三维联合经验分布函数图。最开始我是直接分别算ecdf 得到两个f和x,y。结果的x,y做X轴Y轴的值,两个f相乘做Z轴。代码如下,绘制的图比较相近。
但是我问了下导师,我这种求法前提是X和Y是相互独立的。我的数据[X Y]中的X和Y不是独立的,不能简单地分别用ecdf来求然后概率相乘。想问下大神们,一组二维数据,要如何绘制三维的联合经验分布函数图

Z=xlsread('Linton3.xlsx')
X=Z(:,1);
Y=Z(:,2);
[f1,x] = ecdf(X);
[f2,y] = ecdf(Y);
[XX,YY]=meshgrid(x,y);
[ff1,ff2]=meshgrid(f1,f2);
ZZ=ff1.*ff2
surf(XX,YY,ZZ,'EdgeColor','none');

img

你好同学,给你编了一个专属函数ecdf2:

function [X, Y, CDF] = ecdf2(x,y,nx,ny,xminmax,yminmax)
% x:x的值
% y:y的值
% nx:x方向划分段数
% ny:y方向划分段数
% xminmax = [xmin, xmax]
% yminmax = [ymin, ymax]
num = length(x);
if(num~=length(y))
   error('输入的x和y长度必须相等') 
end
if(nargin>6) % 如果变量个数大于6个,太多了
    error('太多输入变量')
elseif(nargin<2) % 如果变量个数小于2个,太少了
    error('输入变量数目不足!!')
end
if(nargin==6) % 如果变量个数等于6个,赋值给ymin和ymax
    ymin = yminmax(1);
    ymax = yminmax(2);
end
if(nargin>=5)% 如果变量个数大于等于5个,赋值给xmin和xmax
    xmin = xminmax(1);
    xmax = xminmax(2);
end
if(nargin<=4)% 如果变量个数小于等于4个,自定义xmin和xmax
    xmin = min(x);
    xmax = max(x)+eps;
    ymin = min(y);
    ymax = max(y)+eps;
end
if(nargin<=3)% 如果变量个数小于等于3个,自定义y方向划分段数ny
    ny = 30;
end
if(nargin==2)% 如果变量个数等于2个,自定义x方向划分段数nx
    nx = 30;
end
xg = linspace(xmin, xmax, nx);%x方向的点
yg = linspace(ymin, ymax, ny);%y方向的点
[X,Y] = meshgrid(xg, yg);%形成网格
[I,J] = meshgrid(1:nx, 1:ny);%下标网格
CDF = arrayfun(@(i,j)sum(x<X(i,j)&y<Y(i,j))/num,I,J);%形成经验分布
end

然后调用就行:

clc;clear
num = 1000000;
x = randn(num,1);% 为了说明弄了两个正态分布搞联合,实际数据会更好
y = randn(num,1);
[X, Y, CDF] = ecdf2(x,y);% ,50,50,[-3, 3],[-3, 3]
surf(X,Y,CDF)

可以看到效果杠杠的:

img