Tenho algumas observações e quero imitar a amostragem com base nessas observações. A partir do momento em que o CDF é capturado, o CDF é transferido para o CDF e o CDF é transferido para o CDF, o que significa que o CDF pode ser usado como um arquivo não-paramétrico, para facilitar a estimativa de um CDF a partir de observações limitadas. probabilidade usando distribuição uniforme e tomar o inverso do CDF com relação ao valor da probabilidade)
x = [randn(100, 1); rand(100, 1)+4; rand(100, 1)+8];
[f, xi] = ksdensity(x, 'Function', 'cdf', 'NUmPoints', 300);
cdf = [xi', f'];
nbsamp = 100;
rndval = zeros(nbsamp, 1);
for i = 1:nbsamp
p = rand;
[~, idx] = sort(abs(cdf(:, 2) - p));
rndval(i, 1) = cdf(idx(1), 1);
end
figure(1);
hist(x, 40)
figure(2);
hist(rndval, 40)
Como mostrado no código, usei um exemplo sintético para testar meu procedimento, mas o resultado é insatisfatório, conforme ilustrado pelas duas figuras abaixo (a primeira é para as observações simuladas e a segunda figura mostra o histograma extraído do CDF estimado) :
Existe alguém que sabe onde está o problema? Agradeço antecipadamente.
fonte
Respostas:
Um estimador de densidade do kernel (KDE) produz uma distribuição que é uma mistura local da distribuição do kernel, portanto, para extrair um valor da estimativa de densidade do kernel, tudo o que você precisa fazer é: (1) extrair um valor da densidade do kernel e, em seguida, (2) selecione independentemente um dos pontos de dados aleatoriamente e adicione seu valor ao resultado de (1).
Aqui está o resultado desse procedimento aplicado a um conjunto de dados como o da pergunta.
O histograma à esquerda mostra a amostra. Para referência, a curva preta representa a densidade a partir da qual a amostra foi retirada. A curva vermelha representa o KDE da amostra (usando uma largura de banda estreita). (Não é um problema, ou mesmo inesperado, que os picos vermelhos sejam mais curtos que os pretos: o KDE espalha as coisas para que os picos fiquem mais baixos para compensar.)
O histograma à direita mostra uma amostra (do mesmo tamanho) do KDE. As curvas em preto e vermelho são as mesmas de antes.
Evidentemente, o procedimento usado para amostrar a partir da densidade funciona. Também é extremamente rápido: a
R
implementação abaixo gera milhões de valores por segundo a partir de qualquer KDE. Eu comentei bastante para ajudar na portabilidade para Python ou outras linguagens. O próprio algoritmo de amostragem é implementado na funçãordens
com as linhasrkernel
desenhan
amostras de iid da função kernel enquantosample
desenhan
amostras com substituição dos dadosx
. O operador "+" adiciona as duas matrizes de amostras componente por componente.como reivindicado.
fonte
Você colhe amostras do CDF primeiro, invertendo-o. O CDF inverso é chamado de função quantil; é um mapeamento de [0,1] para o domínio do VD. Em seguida, você amostra RVs uniformes aleatórios como percentis e os passa para a função quantil para obter uma amostra aleatória dessa distribuição.
fonte
Aqui, também quero postar o código do Matlab seguindo a idéia descrita pelo whuber, para ajudar aqueles que estão mais familiarizados com o Matlab do que com o R.
O seguinte é o resultado:
Diga-me se alguém encontrar algum problema com o meu entendimento e o código. Obrigado.
fonte
Sem olhar muito de perto para sua implementação, não obtenho completamente seu procedimento de indexação no ICDF. Eu acho que você tira do CDF, não é inverso. Aqui está a minha implementação:
fonte