Vergleich zweier multinomialer Verteilungen

7

Hintergrund: Stellen Sie sich eine in 8 Scheiben geschnittene Pizza vor.

[8 Pizzastücke]

An jeder geraden Kante der Scheibe füge ich einen Magneten mit entgegengesetzten Polaritäten nach außen ein. Wenn ich diese Komponenten trenne, ein Umdrehen verhindere und sie schüttle, sollten sie eine volle Pizza bilden.

Wenn ich jetzt ein zusätzliches Stück (gleiche Abmessungen, 1/8 einer vollen Pizza) lege, bildet sich nicht immer eine volle Pizza. Es könnte Cluster bilden aus: 4 & 5, 3 & 6, 2 & 7 und 1 & 8.

Ein Modell (gegeben von Hosokawa et al. (1994)) gibt mir die Wahrscheinlichkeit, dass sich jeder Cluster bildet. Um das Modell zu validieren, mache ich einige physikalische Experimente. Ich führe 20 Versuche für jede experimentelle Bedingung durch.

Meine Ergebnisse sehen folgendermaßen aus:

Cluster  Theoretical  Physical
3,6:    6.01961132827  4  
1,8:    2.77455224377  5  
4,5:    6.62198848501  5  
2,7:    4.58384794294  6  

Die oben genannten Daten sind eine Multinomialverteilung (ähnlich einer Verteilung, die beim Würfeln erhalten wird). Wenn 9 Scheiben vorhanden sind, kann jeder Versuch in einem von 4 Zuständen enden.

Zusätzlich zum 9-Slice-Experiment habe ich auch Daten für ein 40-Slice-Experiment (und einige andere). (Bitte lassen Sie mich wissen, ob ich es hier aufnehmen soll.)

Problem: Um die Passgenauigkeit zu testen, würde ich einen Pearson-Chi-Quadrat-Test durchführen. Da die Mittelwerte beider Verteilungen jedoch "nahe" liegen, kann ich die Nullhypothese nicht ablehnen. Die Nullhypothese kann ich jedoch auch nicht akzeptieren.

Frage: Gibt es eine bessere Möglichkeit zu zeigen, wie nahe das Modell den physikalischen Experimenten kommt? Das multinomiale Äquivalent der "Standardabweichung" oder vielleicht ein Konfidenzintervall? Regression mit Konfidenzintervallen?

Update: Ein Kollege von mir schlug den folgenden Ansatz für die Regressionsanalyse in R vor:

d=read.csv("data.csv")
length(unique(d$abs_state))
nrow(d)
d$n_componentsf=as.factor(d$n_components)

ncomps=9
dsubs=d[d$n_components==ncomps,]
# using exact multinomial test in EMT (better)
library(EMT)
# using Chi square test statistics
EMT::multinomial.test(dsubs$freq_obs, 
                      dsubs$freq_pred/sum(dsubs$freq_pred),
                      useChisq=TRUE,MonteCarlo=FALSE)
# using p value calculated via Monte Carlo approach
EMT::multinomial.test(dsubs$freq_obs, 
                      dsubs$freq_pred/sum(dsubs$freq_pred),
                      ntrial = 100000,
                      MonteCarlo=TRUE)

# other exact multinomial test implementation
library(RVAideMemoire)
RVAideMemoire::multinomial.test(dsubs$freq_obs, 
                                p=dsubs$freq_pred/sum(dsubs$freq_pred))


# if you're interested in 95% confidence limits
# on your multinomial proportions you can 
# calculate these like this
library(DescTools)
MultinomCI(dsubs$freq_obs, conf.level=0.95)

library(ggplot2)
library(lattice)

# if you would like to analyse all data together
# you could also analyse the observed frequency
# counts as having approx Poisson expectation,
# using a Poisson GLM 
# (or a binomial GLM if you put cbind(freq_obs,freq_notobs) as your dependent var and use family=binomial)
library(afex)
library(MASS)
library(car)
library(effects)
set_sum_contrasts() # use effect coding, as data is unbalanced

fit=glm(freq_obs ~ freq_pred, 
        family=quasipoisson, data=d)
summary(fit)
Anova(fit, test="LR", type="III")

plot(allEffects(fit),type="response", rug=F)
plot1=plot(Effect(c("freq_pred"),
            mod=fit),type="response",rug=F)
plot2=xyplot(freq_obs ~ freq_pred,
             data=d,
             type=c("p"),
             par.settings=
               simpleTheme(col=c("blue","red"),pch=16,cex=1.1))
library(latticeExtra)
plot1+plot2 # nice correspondence between observed and expected frequencies

# sticking model predictions in data frame and
# plotting this in ggplot2 instead
df=data.frame(effect(term="freq_pred",
                  mod=fit,
                  xlevels=list(freq_pred=seq(0,15,1)),type="response"))
df

library(ggplot2)
library(ggthemes)
ggplot(data=df) +
  geom_ribbon(data = df, 
              aes(x=freq_pred, ymin=lower, ymax=upper), linetype=2, alpha=0.1) +
  geom_line(data = df, aes(x=freq_pred, y=fit)) +
  geom_point(data = d, aes(x=freq_pred, y=freq_obs, color=n_componentsf), cex=3) +
  ylab("Predicted frequency") + 
  xlab("Observed frequency") +
  theme_few(base_size=16) 

Data.csv hat:

n_components,abs_state,freq_pred,freq_obs,freq_notobs
9,"3,6",6.019611328,4,16
9,"1,8",2.774552244,5,15
9,"4,5",6.621988485,5,15
9,"2,7",4.583847943,6,14
15,"3,6,6",1.81009773,0,20
15,"4,5,6",3.927622683,7,13
15,"7,8",13.49657189,13,7
15,"5,5,5",0.765707695,0,20
40,"4,5,5,5,6,7,8",0.803987454,0,20
40,"5,6,6,7,8,8",3.376961833,3,17
40,"2,7,7,8,8,8",0.230595232,0,20
40,"5,7,7,7,7,7",0.175319358,0,20
40,"5,6,7,7,7,8",2.709196442,1,19
40,"5,5,5,5,6,7,7",0.170797287,0,20
40,"4,5,5,6,6,7,7",0.847746645,1,19
40,"8,8,8,8,8",0.230119576,0,20
40,"4,6,7,7,8,8",1.795116571,0,20
40,"6,6,6,6,8,8",0.483846181,0,20
40,"5,5,5,5,6,6,8",0.185675465,1,19
40,"4,7,7,7,7,8",0.4072505,0,20
40,"5,5,5,6,6,6,7",0.274814936,1,19
40,"5,5,6,8,8,8",0.708881447,1,19
40,"4,6,6,8,8,8",0.479526825,1,19
40,"4,5,5,5,5,8,8",0.071967085,0,20
40,"5,5,7,7,8,8",1.233981848,1,19
40,"4,5,6,6,6,6,7",0.34756786,1,19
40,"6,6,6,7,7,8",2.208449237,2,18
40,"4,5,5,6,6,6,8",0.494611498,1,19
40,"5,5,5,5,5,7,8",0.061650486,0,20
40,"4,5,5,5,5,5,5,6",0.010322162,0,20
40,"3,6,6,6,6,6,7",0.071274376,0,20
40,"4,6,6,6,6,6,6",0.015244456,0,20
40,"6,6,7,7,7,7",0.656508868,1,19
40,"4,5,5,5,7,7,7",0.155256863,2,18
40,"5,5,6,6,6,6,6",0.04917738,0,20
40,"3,6,7,8,8,8",0.634760319,0,20
40,"3,7,7,7,8,8",0.430171526,1,19
40,"5,5,5,5,5,5,5,5",0.00022644,0,20

Der Code erstellt 3 beeindruckende [zumindest für mich :)] Diagramme. Ich bin jedoch skeptisch hinsichtlich ihrer Richtigkeit. Soweit ich weiß, repräsentiert die Regressionskurve die Entsprechung zwischen den Vorhersagen und Beobachtungen. Diese Kurve ist angesichts der Entsprechungen wahrscheinlich die "beste Anpassung". Es scheint mir jedoch ein Anliegen zu sein, dass ein Großteil der entsprechenden Punkte zu Beginn gemacht wird. Ist dieses Anliegen berechtigt?

Wie wird das Konfidenzintervall unter Bezugnahme auf die Regressionskurve berechnet? Ich fand das Papier von Bauer (1972), konnte es aber nicht zufriedenstellend verstehen. Es wird hilfreich sein, zu verstehen, wie das Konfidenzintervall berechnet wird.

Andere (möglicherweise rudimentäre) Fragen: - Wie wirkt es sich aus, wenn ein Zustand auf dem Regressionsplot nicht beobachtet wird? Zum Beispiel werden der 1. und 4. Zustand des 15-Schicht-Experiments physikalisch nicht beobachtet? - Gibt es im dritten Diagramm (das Sie nach Ausführung des R-Codes erhalten) einen bestimmten Grund, warum die Achsen möglicherweise umgedreht werden?

Welche Schlussfolgerungen kann ich schließlich aus den Darstellungen ziehen? Die meisten Korrespondenzpunkte im Regressionsdiagramm liegen außerhalb des Konfidenzintervalls. Ist dies ein narrensicherer Hinweis auf die (Un-) Fähigkeit des Modells, Vorhersagen zu treffen?

Schließlich sind die Daten offensichtlich unzureichend. Um die erforderliche Datenmenge zu finden, müsste eine ausreichende Anzahl von Versuchen durchgeführt werden, bis das Konfidenzintervall auf eine gewünschte Breite reduziert ist (ich habe festgestellt, dass die Auswahl dieser Breite nicht trivial ist). Ich habe versucht, vorhergesagte Frequenzen zufällig zu replizieren (Bootstrapping des armen Mannes?), Aber ich stoße erneut auf das Problem, nicht zu verstehen, wie das Konfidenzintervall aus den Chi-Quadrat-Statistiken von Pearson berechnet wird.

troisquatre
quelle
Dieser Kommentar ist möglicherweise nicht ganz hilfreich, aber da die multinomiale Verteilung multivariat ist, wäre das Analogon der Varianz die (Co-) Varianzmatrix en.wikipedia.org/wiki/Covariance_matrix. Ich bin mit multivariaten Statistiken nicht vertraut genug, um Empfehlungen zu geben spezifische Tests zur Verwendung mit der Kovarianzmatrix.
Chill2Macht
1
@ Chill2Macht danke für deine superschnelle Antwort! Ich habe die Kovarianzmatrix in Betracht gezogen, aber ein paar Bedenken: (1) Ich bin nicht sicher, was ich in der Kovarianzmatrix verwenden müsste, und (2) "Standardabweichung" ist (var) ^ 0,5. Was wäre das in einer Kovarianzmatrix? Mein Griff zu Statistiken ist nicht gut genug, um das selbst herauszufinden.
Troisquatre
Nun, eine Matrix ist genau dann eine Kovarianzmatrix mit einer gewissen Verteilung, wenn sie positiv semidefinit ist und jede positive semidefinitive Matrix eine "Quadratwurzel" linear.ups.edu/jsmath/0210/fcla-jsmath-2.10li108 hat .html - Wie man diese Tatsache in einem statistischen Kontext anwendet, weiß ich nicht. Es wäre der Blinde, der den Blinden führt. Ich war mir nicht sicher, ob Sie an die Kovarianzmatrix gedacht hatten, und manchmal kann das Wissen um die Terminologie das versehentliche Stolpern über das richtige Ergebnis bei Google erheblich erleichtern. Aber ansonsten weiß ich es nicht wirklich, es tut mir leid.
Chill2Macht
@ Chill2Macht: Vielen Dank für die Eingabe. Wenn Sie jemanden kennen, der möglicherweise in der Lage ist, mein Problem zu beleuchten, teilen Sie dieser Person bitte meine Fragen mit.
Troisquatre
Interessieren Sie sich für ein Maß für Unsicherheit, Folgerung oder ein beschreibendes Maß?
Todd D

Antworten:

0

Ich glaube, der beste Test für Ihre Daten ist der Multinomialtest, den Sie bereits geschätzt haben.

Betrachten Sie für ein "Maß" der Differenz zwischen der erwarteten und der beobachteten Verteilung die Kullback-Leibler-Divergenz. Für Ihr erstes Experiment:

require(entropy)
cv <- d[1:4,]
set.seed(42)
probs <- cv$freq_pred/20
cv$freq_exp <- table(sample(c(1:4), 10000, prob=probs, replace=T))
KL.empirical(cv$freq_exp, cv$freq_obs)

Die KL-Divergenz beträgt 0,072. Bei 0 ähnelt die 2. Verteilung der 1. Verteilung. Wenn 1, ist die 2. Verteilung weniger mit der 1. Verteilung verbunden. Mehr hier für eine feinere Interpretation basierend auf Informationstheorie.

Todd D.
quelle