基于数据集的Matlab条件概率

基于数据集的Matlab条件概率,matlab,dataset,probability,Matlab,Dataset,Probability,我有一个矩阵M的500x5,我需要计算条件概率。我已经离散了我的数据,然后我有了这段代码,它目前只适用于3变量,而不是5,但现在还可以 下面的代码已经计算出我得到A=1,B=1和C=1的次数,我们得到A=2,B=1,C=1等的次数 data = M; npatients=size(data,1) asum=zeros(4,2,2) prob=zeros(4,2,2) for patient=1:npatients, h=data(patient,1) i=data(patient,2) j=

我有一个矩阵
M
500x5
,我需要计算条件概率。我已经离散了我的数据,然后我有了这段代码,它目前只适用于
3
变量,而不是
5
,但现在还可以

下面的代码已经计算出我得到
A=1
B=1
C=1
的次数,我们得到
A=2
B=1
C=1
等的次数

data = M;

npatients=size(data,1)

asum=zeros(4,2,2)
prob=zeros(4,2,2)
for patient=1:npatients,
h=data(patient,1)
i=data(patient,2)
j=data(patient,3)
asum(h,i,j)=asum(h,i,j)+1
end
for h=1:4,
for i=1:2,
for j=1:2,
prob(h,i,j)=asum(h,i,j)/npatients
end
end
end
因此,我需要对代码进行求和,以得到我们得到
A=1
B=1
(将所有C相加)的时间数,从而找到:

这是第一条规则的规则强度。我需要了解如何循环
A
B
C
以获得其余部分,以及如何在Matlab中实际实现这一点。我不知道它是否有用,但我有代码将每一列放入它自己的东西中

dest = M(:,1); gen = M(:,2); age = M(:,3); year = M(:,4); dur = M(:,5);
所以说,
dest
是结果,
gen
age
是前因,我该怎么做呢

以下是第一批
10
患者的数据示例:

destination gender  age
       2    2   2
       2    2   2
       2    2   2
       2    2   2
       2    2   2
       2    1   1
       3    2   2
       2    2   2
       3    2   1
       3    2   1

非常感谢您的帮助。

由于您的代码无法通过复制和粘贴工作,我对其进行了一点修改

最好定义一个函数来计算给定数据的概率

function p = prob(data)
n = size(data,1);
uniquedata = unique(data);
p = zeros(length(uniquedata),2);
p(:,2) = uniquedata;
for i = 1 : size(uniquedata,1)
    p(i,1) = sum(data == uniquedata(i)) / n;
end
end
现在在另一个脚本中

data =[3    2   91;
       3    2   86;
       3    2   90;
       3    2   85;
       3    2   86;
       3    1   77;
       4    2   88;
       3    2   90;
       4    2   79;
       4    2   77;
       4    1   65;
       3    1   60];
pdest = prob(data(:,1));
pgend = prob(data(:,2));
page = prob(data(:,3));
这会给,

page =

0.0833   60.0000
0.0833   65.0000
0.1667   77.0000
0.0833   79.0000
0.0833   85.0000
0.1667   86.0000
0.0833   88.0000
0.1667   90.0000
0.0833   91.0000

pgend =

0.2500    1.0000
0.7500    2.0000

pdest =

0.6667    3.0000
0.3333    4.0000
这将给出你已经计算过的概率

请注意,
prob
的第二列是值,第一列是概率

当您想要计算des=3&gend=2的概率时,您应该创建一个新的数据集并调用
prob
,以供新的数据集使用

mapd2g3 = data(:,1) == 3 & data(:,2) == 2;
datad2g3 = data(mapd2g3,:)

 3     2    91
 3     2    86
 3     2    90
 3     2    85
 3     2    86
 3     2    90

paged2g3 = prob(datad2g3(:,3))

0.1667   85.0000
0.3333   86.0000
0.3333   90.0000
0.1667   91.0000
这是
问题(年龄|目标=3&gend=2)


您甚至可以编写一个函数来创建数据集。

对于
asum(h,i,j)=asum(h,i,j)+1
j
91
,感谢您的回复。请你详细说明一下好吗?我已经在代码中有了asum(h,I,j)=asum(h,I,j)+1(在j=data(patient,3)之后),但不是作为for循环,我应该做什么?它不能通过复制和粘贴工作的原因是因为它不是完整的代码,对此表示抱歉。我还忘了说程序将年龄离散化为1或2,1=80@adammcbrinn,看看概率是否正确。谢谢,这真的很有用,但是我不知道如何使用函数。我是否创建了一个名为prob的文件,并将第一位放入其中,然后调用它,如果是,我如何调用它?@adammcbrinn,是的,将第一个脚本复制到一个新的m文件中,并用名称
prob
保存它。在您的主脚本中调用它,就像
pdest=prob(data(:,1))如我所知。您必须提供正确的数据列作为
prob
的输入。它的作用类似于matlab自己的函数之一。我注意到你昨天也发了同样的问题,但是问题很乱!现在好多了。是的,它起作用了:D我看着它,觉得它看起来不对,然后记得数据是离散的哈哈。非常感谢你的帮助。
mapd2g3 = data(:,1) == 3 & data(:,2) == 2;
datad2g3 = data(mapd2g3,:)

 3     2    91
 3     2    86
 3     2    90
 3     2    85
 3     2    86
 3     2    90

paged2g3 = prob(datad2g3(:,3))

0.1667   85.0000
0.3333   86.0000
0.3333   90.0000
0.1667   91.0000