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.
Acima está o cdf de data_a vs cdf de data_b
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
fonte
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 dadosRespostas:
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 .
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 .
fonte
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:
fonte
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.
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.
fonte