scipy.stats.

page_trend_test#

scipy.stats.page_trend_test(data, ranked=False, predicted_ranks=None, method='auto')[Quelle]#

Führt Page’s Test durch, ein Maß für den Trend bei Beobachtungen zwischen Behandlungen.

Page’s Test (auch bekannt als Page’s \(L\)-Test) ist nützlich, wenn

  • es \(n \geq 3\) Behandlungen gibt,

  • \(m \geq 2\) Subjekte für jede Behandlung beobachtet werden und

  • die Beobachtungen hypothetisch einer bestimmten Reihenfolge folgen.

Insbesondere betrachtet der Test die Nullhypothese, dass

\[m_1 = m_2 = m_3 \cdots = m_n,\]

wobei \(m_j\) der Mittelwert der beobachteten Größe unter Behandlung \(j\) ist, gegen die alternative Hypothese, dass

\[m_1 \leq m_2 \leq m_3 \leq \cdots \leq m_n,\]

wobei mindestens eine Ungleichung strikt ist.

Wie von [4] bemerkt, hat Page’s \(L\)-Test eine größere statistische Aussagekraft als der Friedman-Test gegen die Alternative, dass ein Trendunterschied besteht, da Friedman’s Test nur einen Unterschied in den Mittelwerten der Beobachtungen berücksichtigt, ohne ihre Reihenfolge zu berücksichtigen. Während Spearman \(\rho\) die Korrelation zwischen den Rangordnungen von zwei Variablen betrachtet (z. B. die Fluggeschwindigkeit einer Schwalbe im Vergleich zum Gewicht der Kokosnuss, die sie trägt), beschäftigt sich Page’s \(L\) mit einem Trend in einer Beobachtung (z. B. der Fluggeschwindigkeit einer Schwalbe) über mehrere verschiedene Behandlungen hinweg (z. B. das Tragen von fünf Kokosnüssen unterschiedlichen Gewichts), auch wenn die Beobachtung mit mehreren Subjekten wiederholt wird (z. B. eine europäische Schwalbe und eine afrikanische Schwalbe).

Parameter:
dataarray-ähnlich

Ein \(m \times n\)-Array; das Element in Zeile \(i\) und Spalte \(j\) ist die Beobachtung, die dem Subjekt \(i\) und der Behandlung \(j\) entspricht. Standardmäßig wird angenommen, dass die Spalten in der Reihenfolge zunehmender vorhergesagter Mittelwerte angeordnet sind.

rankedboolean, optional

Standardmäßig wird davon ausgegangen, dass data Beobachtungen und keine Ränge sind; es wird mit scipy.stats.rankdata entlang von axis=1 eingestuft. Wenn data in Form von Rängen übergeben wird, übergeben Sie das Argument True.

predicted_ranksarray-ähnlich, optional

Die vorhergesagten Ränge der Spaltenmittelwerte. Wenn nicht angegeben, wird angenommen, dass die Spalten in der Reihenfolge zunehmender vorhergesagter Mittelwerte angeordnet sind, sodass die Standard- predicted_ranks \([1, 2, \dots, n-1, n]\) sind.

method{‘auto’, ‘asymptotic’, ‘exact’}, optional

Wählt die Methode zur Berechnung des p-Werts aus. Die folgenden Optionen sind verfügbar.

  • ‘auto’: wählt zwischen ‘exact’ und ‘asymptotic’, um einigermaßen genaue Ergebnisse in angemessener Zeit zu erzielen (Standard)

  • ‘asymptotic’: vergleicht die standardisierte Teststatistik mit der Normalverteilung

  • ‘exact’: berechnet den exakten p-Wert, indem die beobachtete \(L\)-Statistik mit denen verglichen wird, die durch alle möglichen Permutationen von Rängen realisiert wurden (unter der Nullhypothese, dass jede Permutation gleich wahrscheinlich ist)

Rückgabe:
resPageTrendTestResult

Ein Objekt, das Attribute enthält

statisticfloat

Page’s \(L\)-Teststatistik.

pvaluefloat

Der zugehörige p-Wert

method{‘asymptotic’, ‘exact’}

Die Methode zur Berechnung des p-Werts

Hinweise

Wie in [1] bemerkt, „könnten die \(n\) ‚Behandlungen‘ genauso gut \(n\) Objekte oder Ereignisse oder Leistungen oder Personen oder Versuchsdurchläufe darstellen, die eingestuft wurden.“ Ebenso könnten die \(m\) ‚Subjekte‘ genauso gut \(m\) „Gruppierungen nach Fähigkeit oder einer anderen Kontrollvariablen, oder beurteilenden Personen, die die Rangfolge erstellen, oder zufälligen Replikationen einer anderen Art“ darstellen.

Das Verfahren zur Berechnung der \(L\)-Statistik, adaptiert von [1], lautet:

  1. „Bestimmen Sie mit sorgfältiger Logik die geeigneten Hypothesen bezüglich der vorhergesagten Reihenfolge der experimentellen Ergebnisse. Wenn keine vernünftige Grundlage für die Reihenfolge von Behandlungen bekannt ist, ist der \(L\)-Test nicht geeignet.“

  2. „Wie bei anderen Experimenten legen Sie fest, auf welchem Konfidenzniveau Sie die Nullhypothese ablehnen werden, dass keine Übereinstimmung der experimentellen Ergebnisse mit der monotonen Hypothese besteht.“

  3. „Ordnen Sie das experimentelle Material in eine zweidimensionale Tabelle mit \(n\) Spalten (Behandlungen, eingestufte Objekte, Bedingungen) und \(m\) Zeilen (Subjekte, Replikationsgruppen, Ebenen von Kontrollvariablen) ein.“

  4. „Wenn experimentelle Beobachtungen aufgezeichnet werden, ordnen Sie sie zeilenweise an“, z. B. ranks = scipy.stats.rankdata(data, axis=1).

  5. „Addieren Sie die Ränge in jeder Spalte“, z. B. colsums = np.sum(ranks, axis=0).

  6. „Multiplizieren Sie jede Summe der Ränge mit dem vorhergesagten Rang für dieselbe Spalte“, z. B. products = predicted_ranks * colsums.

  7. „Summieren Sie alle diese Produkte“, z. B. L = products.sum().

[1] schlägt weiter die Verwendung der standardisierten Statistik vor

\[\chi_L^2 = \frac{\left[12L-3mn(n+1)^2\right]^2}{mn^2(n^2-1)(n+1)}\]

„die annähernd als Chi-Quadrat mit 1 Freiheitsgrad verteilt ist. Die gewöhnliche Verwendung von \(\chi^2\)-Tabellen wäre äquivalent zu einem zweiseitigen Test der Übereinstimmung. Wenn ein einseitiger Test gewünscht wird, *was fast immer der Fall sein wird*, sollte die im Chi-Quadrat-Tabelle gefundene Wahrscheinlichkeit halbiert werden.“

Diese standardisierte Statistik unterscheidet jedoch nicht, ob die beobachteten Werte gut mit den vorhergesagten Rängen korreliert sind oder *anti*-korreliert sind. Stattdessen folgen wir [2] und berechnen die standardisierte Statistik

\[\Lambda = \frac{L - E_0}{\sqrt{V_0}},\]

wobei \(E_0 = \frac{1}{4} mn(n+1)^2\) und \(V_0 = \frac{1}{144} mn^2(n+1)(n^2-1)\), „die unter der Nullhypothese asymptotisch normal ist“.

Der p-Wert für method='exact' wird generiert, indem der beobachtete Wert von \(L\) mit den \(L\)-Werten verglichen wird, die für alle \((n!)^m\) möglichen Permutationen von Rängen generiert wurden. Die Berechnung erfolgt mittels der rekursiven Methode aus [5].

Die p-Werte werden nicht für die Möglichkeit von Bindungen angepasst. Wenn Bindungen vorhanden sind, können die berichteten 'exact' p-Werte etwas größer (d.h. konservativer) sein als der tatsächliche p-Wert [2]. Die 'asymptotic' p-Werte sind jedoch tendenziell kleiner (d.h. weniger konservativ) als die 'exact' p-Werte.

Referenzen

[1] (1,2,3,4)

Ellis Batten Page, „Ordered hypotheses for multiple treatments: a significant test for linear ranks“, Journal of the American Statistical Association 58(301), S. 216–230, 1963.

[2] (1,2)

Markus Neuhauser, Nonparametric Statistical Test: A computational approach, CRC Press, S. 150–152, 2012.

[3] (1,2)

Statext LLC, „Page’s L Trend Test - Easy Statistics“, Statext - Statistics Study, https://www.statext.com/practice/PageTrendTest03.php, abgerufen am 12. Juli 2020.

[4]

„Page’s Trend Test“, Wikipedia, WikimediaFoundation, https://en.wikipedia.org/wiki/Page%27s_trend_test, abgerufen am 12. Juli 2020.

[5]

Robert E. Odeh, „The exact distribution of Page’s L-statistic in the two-way layout“, Communications in Statistics - Simulation and Computation, 6(1), S. 49–61, 1977.

Beispiele

Wir verwenden das Beispiel aus [3]: 10 Studenten werden gebeten, drei Lehrmethoden – Tutorial, Vorlesung und Seminar – auf einer Skala von 1-5 zu bewerten, wobei 1 die niedrigste und 5 die höchste Bewertung ist. Wir haben entschieden, dass ein Konfidenzniveau von 99 % erforderlich ist, um die Nullhypothese zugunsten unserer Alternative zu verwerfen: dass das Seminar die höchsten Bewertungen und das Tutorial die niedrigsten haben wird. Anfangs wurden die Daten so tabelliert, dass jede Zeile die Bewertungen eines einzelnen Studenten für die drei Methoden in folgender Reihenfolge darstellt: Tutorial, Vorlesung, Seminar.

>>> table = [[3, 4, 3],
...          [2, 2, 4],
...          [3, 3, 5],
...          [1, 3, 2],
...          [2, 3, 2],
...          [2, 4, 5],
...          [1, 2, 4],
...          [3, 4, 4],
...          [2, 4, 5],
...          [1, 3, 4]]

Da hypothetisch angenommen wird, dass das Tutorial die niedrigsten Bewertungen hat, sollte die Spalte, die den Tutorial-Rängen entspricht, an erster Stelle stehen; das Seminar hat hypothetisch die höchsten Bewertungen, daher sollte seine Spalte an letzter Stelle stehen. Da die Spalten bereits in dieser Reihenfolge zunehmender vorhergesagter Mittelwerte angeordnet sind, können wir die Tabelle direkt an page_trend_test übergeben.

>>> from scipy.stats import page_trend_test
>>> res = page_trend_test(table)
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0018191161948127822,
                    method='exact')

Dieser p-Wert zeigt an, dass eine Wahrscheinlichkeit von 0,1819 % besteht, dass die \(L\)-Statistik unter der Nullhypothese einen solch extremen Wert erreicht. Da 0,1819 % kleiner als 1 % ist, haben wir bei einem Konfidenzniveau von 99 % Beweise, um die Nullhypothese zugunsten unserer Alternative zu verwerfen.

Der Wert der \(L\)-Statistik beträgt 133,5. Um dies manuell zu überprüfen, ordnen wir die Daten so ein, dass hohe Punktzahlen hohen Rängen entsprechen, und behandeln Bindungen mit einem durchschnittlichen Rang.

>>> from scipy.stats import rankdata
>>> ranks = rankdata(table, axis=1)
>>> ranks
array([[1.5, 3. , 1.5],
       [1.5, 1.5, 3. ],
       [1.5, 1.5, 3. ],
       [1. , 3. , 2. ],
       [1.5, 3. , 1.5],
       [1. , 2. , 3. ],
       [1. , 2. , 3. ],
       [1. , 2.5, 2.5],
       [1. , 2. , 3. ],
       [1. , 2. , 3. ]])

Wir addieren die Ränge innerhalb jeder Spalte, multiplizieren die Summen mit den vorhergesagten Rängen und summieren die Produkte.

>>> import numpy as np
>>> m, n = ranks.shape
>>> predicted_ranks = np.arange(1, n+1)
>>> L = (predicted_ranks * np.sum(ranks, axis=0)).sum()
>>> res.statistic == L
True

Wie in [3] dargestellt, ist die asymptotische Annäherung des p-Werts die Überlebensfunktion der Normalverteilung, die an der standardisierten Teststatistik ausgewertet wird

>>> from scipy.stats import norm
>>> E0 = (m*n*(n+1)**2)/4
>>> V0 = (m*n**2*(n+1)*(n**2-1))/144
>>> Lambda = (L-E0)/np.sqrt(V0)
>>> p = norm.sf(Lambda)
>>> p
0.0012693433690751756

Dies stimmt nicht genau mit dem p-Wert überein, der von page_trend_test oben gemeldet wurde. Die asymptotische Verteilung ist für \(m \leq 12\) und \(n \leq 8\) nicht sehr genau oder konservativ, daher hat page_trend_test die Verwendung von method='exact' basierend auf den Dimensionen der Tabelle und den Empfehlungen in Page’s Originalarbeit [1] gewählt. Um die Wahl von page_trend_test zu überschreiben, geben Sie das Argument method an.

>>> res = page_trend_test(table, method="asymptotic")
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0012693433690751756,
                    method='asymptotic')

Wenn die Daten bereits eingestuft sind, können wir die ranks anstelle der table übergeben, um Rechenzeit zu sparen.

>>> res = page_trend_test(ranks,             # ranks of data
...                       ranked=True,       # data is already ranked
...                       )
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0018191161948127822,
                    method='exact')

Angenommen, die Rohdaten wären in einer anderen Reihenfolge als die Reihenfolge der vorhergesagten Mittelwerte tabelliert worden, z. B. Vorlesung, Seminar, Tutorial.

>>> table = np.asarray(table)[:, [1, 2, 0]]

Da die Anordnung dieser Tabelle nicht mit der angenommenen Reihenfolge übereinstimmt, können wir entweder die Tabelle neu anordnen oder die predicted_ranks angeben. In Erinnerung daran, dass die Vorlesung den mittleren Rang, das Seminar den höchsten und das Tutorial den niedrigsten Rang haben soll, übergeben wir

>>> res = page_trend_test(table,             # data as originally tabulated
...                       predicted_ranks=[2, 3, 1],  # our predicted order
...                       )
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0018191161948127822,
                    method='exact')