Descubra se os dois conjuntos de dados estão próximos um do outro

7

Eu tenho os seguintes três conjuntos de dados.

data_a=[0.21,0.24,0.36,0.56,0.67,0.72,0.74,0.83,0.84,0.87,0.91,0.94,0.97]
data_b=[0.13,0.21,0.27,0.34,0.36,0.45,0.49,0.65,0.66,0.90]
data_c=[0.14,0.18,0.19,0.33,0.45,0.47,0.55,0.75,0.78,0.82]

data_a são dados reais e os outros dois são os simulados. Aqui, estou tentando verificar qual deles (data_b ou data_c) é o mais próximo ou se assemelha ao data_a. Atualmente, estou fazendo isso visualmente e com o teste ks_2samp (python).

Visualmente

Criei um gráfico do cdf de dados reais vs cdf de dados simulados e tento ver visualmente o que é o mais próximo.

cdf de data_a vs data_b

Acima está o cdf de data_a vs cdf de data_b insira a descrição da imagem aqui

Acima está o cdf de data_a vs cdf de data_c

Portanto, ao visualizá-lo, pode-se dizer que data_c está mais próximo de data_a do que data_b, mas ainda não é preciso.

Teste KS

O segundo método é o teste KS, onde eu testei data_a com data_b, bem como data_a com data_c.

>>> stats.ks_2samp(data_a,data_b)
Ks_2sampResult(statistic=0.5923076923076923, pvalue=0.02134674813035231)
>>> stats.ks_2samp(data_a,data_c)
Ks_2sampResult(statistic=0.4692307692307692, pvalue=0.11575018162481227)

Acima, podemos ver que a estatística é mais baixa quando testamos dados_a com dados_c, portanto, dados_c devem estar mais próximos dos dados_a do que os dados_b. Não considerei o pvalor, pois não seria apropriado considerá-lo um teste de hipóteses e usar o valor p obtido porque o teste é projetado com a hipótese nula predeterminada.

Então, minha pergunta aqui é que, se estou fazendo isso corretamente e também há alguma outra maneira melhor de fazê-lo ??? Obrigado

Kartikeya Sharma
fonte
11
Tem certeza de que esses são gráficos CDF dos dados? Gráficos empíricos de CDF desses dados são esses . Parece que você está plotando os valores no eixo y em algum eixo x padrão. Os valores em suas observações ou pontos variáveis ​​estão no CDF?
Edmund
@Fatemehhh Olá, eu não estou plotando esses dois gráficos em um único, pois existem centenas de outros conjuntos de dados que eu preciso comparar com o conjunto de dados real e descobrir qual é o mais próximo do conjunto de dados real. Basicamente, estou tentando aproximar um parâmetro que está gerando diferentes conjuntos de dados simulados com valores diferentes e quando o conjunto de dados simulado está mais próximo do conjunto de dados real, existe o parâmetro correto!
Kartikeya Sharma
@ Edmund Acho que você está correto, esses valores são a observação variável e estou plotando os valores no eixo y sobre algum eixo x padrão. x_points=np.asarray(list(range(0,len(data_a)))) >>> x_points=x_points/len(data_a) >>> plt.plot(x_points,data_a) >>> x_points=np.asarray(list(range(0,len(data_b)))) >>> x_points=np.asarray(list(range(0,len(data_c)))) >>> x_points=x_points/len(data_c) >>> plt.plot(x_points,data_c) Este é o código. Mas a minha pergunta é como pode-se encontrar a proximidade entre os dois conjuntos de dados
Kartikeya Sharma
2
Não seria melhor simplesmente ajustar uma distribuição aos dados observados? Parece um pouco complicado e computacionalmente caro adivinhar parâmetros, simulando resultados e testando similaridade.
Edmund
11
Isso parece muito com um problema XY . Compartilhe o problema que você está tentando resolver em vez desta parte da solução do problema.
Edmund

Respostas:

5

Você pode adotar uma abordagem da Teoria da informação encontrando a menor divergência entre Kullback e Leibler entre as distribuições. Existe uma opção de divergência de KL na função de entropia do SciPy .

>>> from scipy.stats import entropy

>>> p = [0.21,0.24,0.36,0.56,0.67,0.72,0.74,0.83,0.84,0.87] # Data removed to make equal sizes: [0.91,0.94,0.97]
>>> q_1 = [0.13,0.21,0.27,0.34,0.36,0.45,0.49,0.65,0.66,0.90]
>>> print(entropy(p, q_1)) 
0.019822015024454846

>>> q_2 =[0.14,0.18,0.19,0.33,0.45,0.47,0.55,0.75,0.78,0.82]
>>> print(entropy(p, q_2))
0.01737229446663193

A segunda distribuição simulada é mais próxima que a primeira distribuição simulada da distribuição real.

Se você estiver interessado em inferência, poderá executar muitas simulações e calcular valores-p. Esse processo é uma variação do teste de permutação .

Brian Spiering
fonte
Obrigado por sua resposta, mas por que você removeu os dados da distribuição real. Entendo que o método scipy funcionaria apenas com conjuntos de dados iguais, mas quais elementos dos dados remover ou por quê? Aqui eu vejo que você removeu os últimos. Também não existe, de qualquer maneira, para fazê-lo funcionar em conjuntos de dados desiguais?
Kartikeya Sharma
3
Remoção arbitrária de dados para que o exemplo de código funcione. Se fosse o meu projeto, não removeria dados reais. Eu simularia dados para ter o mesmo tamanho que os dados reais. Não seria necessário lidar com conjuntos de dados desiguais porque eu geraria dados de tamanhos iguais. Como esse é o seu projeto, você pode escolher quais dados remover se optar por usar o método de divergência KL do SciPy.
Brian Spiering
2

Considere usar a Distância do Movimentador da Terra (ou seja, a distância de Wasserstein-1 ), que (semelhante à divergência KL) pode ser usada para calcular a "distância" entre conjuntos de pontos (ou melhor, a distribuição empírica induzida por eles). Existe um método no scipy para isso, além desta biblioteca .

Algumas notas:

  • Você não precisa ter o mesmo número de pontos em cada conjunto (o EMD permite "dividir" a massa).
  • Uma vantagem sobre a divergência de KL é que o KLD pode ser indefinido ou infinito se as distribuições não tiverem suporte idêntico (embora o uso da divergência de Jensen-Shannon atenue isso). Além disso, estimar entropias geralmente é difícil e não está livre de parâmetros (geralmente exigindo binning ou KDE), enquanto se pode resolver otimizações de EMD diretamente nos pontos de dados de entrada.
  • Uma vantagem sobre as estatísticas simples (por exemplo, comparar meios e covariâncias ou normas) é que elas tendem a perder informações. Por exemplo, combinar os dois primeiros momentos não força o terceiro momento a corresponder; ou, dois conjuntos de dados podem ter a mesma norma, apesar de serem muito diferentes (porn pontos, todos os pontos do n-hyper-sphere do mesmo raio tem norma idêntica). Por outro lado, o EMD deve considerar a relação de cada ponto em um conjunto com cada ponto no outro.
  • Considero o uso do teste KS perfeitamente razoável. Veja também este post . Uma ressalva é que seu uso do supremo é um pouco extremo. Por exemplo, uma distribuição tem um grande desvio de CDFδ em algum momento e é muito próximo o resto do tempo vs outro que se desvia por δ-ϵ para alguns pequenos ϵmuitas vezes - a estatística KS prefere a primeira. Cabe a você se isso faz sentido.
user3658307
fonte
1

Como não devemos remover nenhum dado ... podemos usar a norma vetorial da origem (norma l2)

dados_a, dados_b, dados_c são matrizes.

 import numpy as np    
 import pandas as pd
 from numpy.linalg import norm
 l2_a=norm(data_a)
 l2_b=norm(data_b)
 l2_c=norm(data_c)
 print(l2_a,l2_b,l2_c)

saída : 2.619885493680974 1.5779100101083077 1.6631897065578538.

como l2_a, valores l2_c estão mais próximos, data_a e data_c estão próximos um do outro.

tharun___ entusiasta dos dados
fonte