Pergunta

Se tivermos uma variável aleatória discreta x e os dados referentes a ele em x (n), como no Matlab podemos determinar a função de massa de probabilidade PMF (x)?

Foi útil?

Solução

Você pode fazer isso de pelo menos oito maneiras diferentes (algumas delas já foram mencionadas nas outras soluções).

Digamos que temos uma amostra de uma variável aleatória discreta:

X = randi([-9 9], [100 1]);

Considere essas soluções equivalentes (observe que não assumo nada sobre a gama de valores possíveis, apenas que eles são inteiros):

[V,~,labels] = grp2idx(X);
mx = max(V);

%# TABULATE (internally uses HIST)
t = tabulate(V);
pmf1 = t(:, 3) ./ 100;

%# HIST (internally uses HISTC)
pmf2 = hist(V, mx)' ./ numel(V);                      %#'

%# HISTC
pmf3 = histc(V, 1:mx) ./ numel(V);

%# ACCUMARRAY
pmf4 = accumarray(V, 1) ./ numel(V);

%# SORT/FIND/DIFF
pmf5 = diff( find( [diff([0;sort(V)]) ; 1] ) ) ./ numel(V);

%# SORT/UNIQUE/DIFF
[~,idx] = unique( sort(V) );
pmf6 = diff([0;idx]) ./ numel(V);

%# ARRAYFUN
pmf7 = arrayfun(@(x) sum(V==x), 1:mx)' ./ numel(V);   %#'

%# BSXFUN
pmf8 = sum( bsxfun(@eq, V, 1:mx) )' ./ numel(V);      %#'

Observe que Grp2idx foi usado para obter índices a partir de 1 correspondente às entradas de pmf (O mapeamento é dado por labels). O resultado do exposto é:

>> [labels pmf]
ans =
           -9         0.03
           -8         0.07
           -7         0.04
           -6         0.07
           -5         0.03
           -4         0.06
           -3         0.05
           -2         0.05
           -1         0.06
            0         0.05
            1         0.04
            2         0.07
            3         0.03
            4         0.09
            5         0.08
            6         0.02
            7         0.03
            8         0.08
            9         0.05

Outras dicas

O trecho seguinte do Matlab documentação mostra como plotar um histograma. Para uma função de probabilidade discreta, o distribuição de frequência pode ser idêntico ao histograma.

x = -4:0.1:4;
y = randn(10000,1);
n = hist(y,x);
pmf = n/sum(n);
plot(pmf,'o');

Calcule a soma de todos os elementos em cada compartimento. Divida todas as caixas pela soma para obter seu PDF. Teste seu PDF adicionando todos os elementos. O resultado deve ser um.

Espero estar certo com minhas declarações. Já faz muito tempo desde ...

Que tal essa função?

function Y = pmf(X)
A=tabulate(X)
A(:,3)=A(:,3)/100
Y=A(:,3)'

Isso está correto na sua opinião?

Talvez tente fazer apenas uma função, para que você não precise armazenar outra matriz:

pmf = @(x) arrayfun(@(y) nnz(DATA==y)/length(DATA),x);

Para adicionar mais uma opção (como existem várias funções disponíveis para fazer o que quiser), você pode facilmente calcular o PMF usando a função Acumarray Se seus valores discretos são inteiros maiores que 0:

pmf = accumarray(X(:),1)./numel(X);

Aqui está um exemplo:

>> X = [1 1 1 1 2 2 2 3 3 4];          %# A sample distribution of values
>> pmf = accumarray(X(:),1)./numel(X)  %# Compute the probability mass function

pmf =

    0.4000      %# 1 occurs 40% of the time
    0.3000      %# 2 occurs 30% of the time
    0.2000      %# 3 occurs 20% of the time
    0.1000      %# 4 occurs 10% of the time

Se eu entendi corretamente o que você precisa fazer é estimar o PDF, exceto que não é valores contínuos, mas discretos.

Calcule as ocorrências de valores diferentes em x (n) e divida por n. Para ilustrar o que estou dizendo, permita -me dar um exemplo. Suponha que você tenha 10 observações:

X = [1 1 2 3 1 9 12 3 1 2]

Então seu PMF ficaria assim:

pmf(X) = [0.4 0.2 0.2 0 0 0 0 0 0.1 0 0 0.1]

editar: Este é em princípio um histograma de frequência, como @zellus também apontou

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top