2010-11-01 21 views
5

Si tenemos una variable aleatoria discreta xy los datos correspondientes a ella en X (n), ¿cómo en matlab podemos determinar la función de masa de probabilidad pmf (X)?Determinar la probabilidad de la función de masa de la variable aleatoria

+0

¿Qué es el "pmf" del conjunto de datos (matemáticamente)? – rubenvb

+0

http://en.wikipedia.org/wiki/Probability_mass_function – zellus

+0

¿debería pmf (X) ser la distribución de frecuencia normalizada de X? En caso afirmativo, ¿tenemos alguna función en Matlab para calcularla? – SkypeMeSM

Respuesta

5

Puede hacer esto en al menos ocho formas diferentes (algunas de ellas ya se mencionaron en las otras soluciones).

Digamos que tenemos una muestra de una variable aleatoria discreta:

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

Considere estas soluciones equivalentes (nótese que no compromete nada sobre el rango 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 
+0

relacionado: http://stackoverflow.com/a/2885175/ 97160 – Amro

1

El siguiente extracto de MATLAB documentation muestra cómo trazar un histograma. Para una función de probabilidad discreta, la distribución de frecuencia podría ser idéntica a la del 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 contenedor. Divida todos los contenedores por la suma para obtener su pdf. Pruebe su pdf agregando todos los elementos. El resultado debe ser uno.

Espero estoy de acuerdo con mis declaraciones. Es un largo tiempo desde ...

0

Si entendí correctamente lo que debe hacer es estimar el pdf, excepto que no es un valor continuo sino discreto.

Calcule las ocurrencias de diferentes valores en X (n) y divida por n. Para ilustrar lo que estoy diciendo, permítanme dar un ejemplo. Suponga que tiene 10 observaciones:

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

entonces su PMF se vería así:

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

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

1

¿Qué tal esta función?

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

¿Es esto correcto en tu opinión?

+0

No sabía esa función. Creo que hace tu trabajo A menudo hay varias maneras de hacer un trabajo en MATLAB. – zellus

+1

Una advertencia ... necesita la caja de herramientas de estadísticas para usar [TABULATE] (http://www.mathworks.com/help/toolbox/stats/tabulate.html). – gnovice

1

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); 
1

Para añadir otra opción (ya que hay un número de funciones disponibles para hacer lo que quiere), usted puede fácilmente 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); 

He aquí 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 
+1

En su lugar usaría: 'pmf = accumarray (X (:), 1); pmf = pmf./sum (pmf); '(numéricamente más estable: una división en lugar de agregar múltiples fracciones) – Amro

+0

@Amro: Muy cierto. Eso reduciría la acumulación de posibles errores de coma flotante. La respuesta ha sido actualizada. – gnovice

+1

también debe tener en cuenta que si el rango de valores posibles no comienza en '1', obtendrá muchos ceros adicionales al principio. Intente ejecutar lo anterior con 'X = X + 100;' (una llamada a GRP2IDX puede resolver este problema) Lo mismo aplica para la solución TABULATE de @SkypeMeSM .. – Amro

Cuestiones relacionadas