Pregunta

Si tenemos una variable aleatoria discreta x y los datos pertenecientes a ella en X (n), la forma en Matlab podemos determinar la función de masa de probabilidad pmf (X)?

¿Fue útil?

Solución

Se puede hacer esto en por lo menos ocho formas diferentes (algunas de ellas ya fueron mencionados en las otras soluciones).

Supongamos que tenemos una muestra de una variable aleatoria discreta:

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

Considere estas soluciones equivalentes (nota que no suponga nada acerca de la gama de valores posibles, sólo que son números enteros):

[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);      %#'

nota que GRP2IDX se utilizó para obtener los índices a partir de 1 correspondientes a las entradas de pmf (el mapeo está dada por labels). El resultado de lo anterior es:

>> [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

Otros consejos

El siguiente extracto de la muestra MATLAB documentación cómo trazar una histograma. Para una función de probabilidad discreta, la distribución de frecuencias podría ser idéntico con el histograma.

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

Calcular la suma de todos los elementos en cada periodo. Dividir todos los contenedores por la suma para obtener su pdf. Pruebe su PDF mediante la suma de todos los elementos. El resultado debe ser uno.

La esperanza que tengo razón con mis declaraciones. Es un largo tiempo desde que ...

¿Qué hay de esta función?

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

Es esto correcto en su opinión?

Tal vez trate de hacer sólo un identificador de función de modo que no es necesario almacenar otra matriz:

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

Para añadir otra opción (ya que hay un número de funciones disponibles para hacer lo que quiere), fácilmente se podría calcular el PMF usando la función accumArray si sus valores discretos son números enteros mayores que 0:

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

Este es un ejemplo:

>> 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

Si he entendido bien lo que tiene que hacer es estimar el pdf, excepto que no es continua, sino que los valores discretos.

Calcular las ocurrencias de diferentes valores en X (n) y se divide por n. Para ilustrar lo que estoy diciendo, por favor, permítame darle un ejemplo. Suponga que tiene 10 observaciones:

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

A continuación, el PMF se vería así:

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

editar esto es, en principio, un histograma de frecuencias, como @zellus también ha señalado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top