2017-12-15 2 views
1

Wie wird die Gleichung für die proportionale Variabilität (Gleichung 1 dieser paper) codiert?Code für proportionale Variabilität

Mein Code ist:

import pandas as pd 

l = pd.Series([1,2,3,4,5,6]) # any list of numbers 
n = len(l) 
if n > 1: 
    C = (n*(n-1))/2 

    D = [] 
    for i in l.index: 
     for j in l.index: 
      if i != j: 
       zi_zj = [l[i],l[j]] 
       D.append(1-((min(zi_zj))/(max(zi_zj)))) 

    PV = (1/C)*(np.sum(D)) 
else: 
    PV = 0 

Wenn ich eine Liste mit allen Zahlen stellte das gleiche, ich PV = 0 bekommen, wie erwartet, aber wenn ich eine Liste mit einer arithmetischen Folge stellte z.B. [0,2,4,6,8], PV = 1.4, und entsprechend der Veröffentlichung, PV sollte zwischen 0 und 1 sein, und eine arithmetische Sequenz sollte eine PV = 0.5 unabhängig von Stichprobengröße n haben.

Eine weitere Option, die ich versuchte, war:

l = pd.Series([1,2,3,4,5,6]) # any list of numbers 
n = len(l) 
if n > 1: 
    C = (n*(n-1))/2 

    i_s = set() 
    j_s = set() 
    D = [] 
    for i in l.index: 
     for j in l.index: 
      if i != j: 
       if i not in i_s: 
        if j not in j_s: 
         zi_zj = [l[i],l[j]] 
         D.append(1-((min(zi_zj))/(max(zi_zj)))) 
         i_s.add(i) 
         j_s.add(j) 

    PV = (1/C)*(np.sum(D)) 
else: 
    PV = 0 

aber auch nicht funktioniert.

Auch habe ich keine Funktion in Python gefunden, die die proportionale Variabilität einer Folge von Zahlen berechnet.

Kann jemand herausfinden, was ich im Code falsch mache, oder lassen Sie mich wissen, wenn es eine eingebaute Funktion gibt?

Antwort

1

Basierend auf den Berechnungen, die ich getan habe, gilt der Wert 0.5 nur für große n; bitte überprüfe, ob ich einen Fehler gemacht habe (habe das Papier nicht im Detail überprüft).

import pandas as pd 
from itertools import combinations 

l = pd.Series(list(range(3))) 

n = len(l) 
C = n * (n - 1)/2. 

# get all pairs in l 
pairs = list(combinations(l, 2)) 

So Paare dann sieht wie folgt aus:

[(0, 1), (0, 2), (1, 2)] 

wir jetzt, dass in einem Datenrahmen speichern können, wie Sie bereits mit Pandas arbeiten, die ganz einfach die nachfolgenden Berechnungen macht:

# store pairs in dataframe 
df_pairs = pd.DataFrame(pairs).rename(columns={0: 'zi', 1: 'zj'}) 

# get max/min for each pair 
max_val = df_pairs.max(axis=1) 
min_val = df_pairs.min(axis=1) 
df_pairs['max_z'] = max_val 
df_pairs['min_z'] = min_val 

# absolute difference between z 
df_pairs['diff_z_abs'] = (df_pairs['zi'] - df_pairs['zj']).abs() 

df_pairs['ratio_diff_max'] = df_pairs['diff_z_abs']/df_pairs['max_z'] 
df_pairs['one_minus_ratio'] = 1. - df_pairs['min_z']/df_pairs['max_z'] 

von Jetzt sieht der Datenrahmen so aus:

zi zj max_z min_z diff_z_abs ratio_diff_max one_minus_ratio 
0 0 1  1  0   1    1.0    1.0 
1 0 2  2  0   2    1.0    1.0 
2 1 2  2  1   1    0.5    0.5 

Der Wert ist dann einfach:

PV = df_pairs['ratio_diff_max'].sum()/C 

Für dieses Beispiel es 0.83333333 ist, so viel höher als 0.5. wenn wir jetzt jedoch ändern

l = pd.Series(list(range(3))) 

auf größere Werte, PV dann nähert sich 0.5. Zum Beispiel für

l = pd.Series(list(range(5000))) 

I erhalten

0.500199 

es also wahrscheinlich gilt nur für n gegen unendlich.

Verwandte Themen