Was ist eine gute Visualisierung für Poisson-Regressionen?

11

Ich möchte Codefehler mit Codekomplexitätsmetriken wie Nähe verknüpfen. Ein gängiges Modell besteht darin, dies als einen Poisson-Prozess zu betrachten, bei dem die Dauer der Codierungszeit und die Dichte eine Funktion der Codekomplexität ist. Ich kann eine Regression durchführen und Signifikanzwerte usw. erhalten.

Es ist jedoch schwierig für mich, die Ergebnisse zu visualisieren (und noch schwieriger für meine weniger mathematisch veranlagten Kollegen). Gibt es eine gute Möglichkeit, dies zu betrachten, um Dinge wie Ausreißer zu betrachten, wenn es sich um einen linearen Trend usw. handelt? (Links zu R-Paketen sind willkommen.)

Zum Beispiel könnte ich nur zeichnen, Defects / Time ~ Complexityaber das ist ziemlich laut und da Defectses diskretisiert und sehr klein ist, ist es schwierig, den Trend zu sehen. Eine Sache, an die ich gedacht habe, ist, dass ich die Daten in Quantile aufteilen und dann eine Regression pro Quantil durchführen und die resultierenden Dichten darstellen könnte - ich bin mir jedoch nicht sicher, wie gültig dies ist, zumal meine Daten möglicherweise nicht normal verteilt sind Menschen darüber irreführen, was ein Quantil ist.

Xodarap
quelle

Antworten:

6

Nachdem Sie das Modell angepasst haben, können Sie vorhergesagte Fehler als Variable verwenden, um sie mit den anderen zu vergleichen, indem Sie die für sie bedeutsamen Standardtechniken verwenden. Es hat den Vorteil, dass es eine kontinuierliche Variable ist, sodass Sie auch kleine Unterschiede erkennen können. Zum Beispiel werden die Leute den Unterschied zwischen einer erwarteten Anzahl von Fehlern von 1,4 und 0,6 verstehen, obwohl beide auf eins runden.

Als Beispiel dafür, wie der vorhergesagte Wert von zwei Variablen abhängt, können Sie ein Konturdiagramm der Zeit v. Komplexität als die beiden Achsen sowie Farbe und Konturen erstellen, um die vorhergesagten Fehler anzuzeigen. und überlagern Sie die tatsächlichen Datenpunkte.

Die folgende Darstellung muss etwas poliert und mit einer Legende versehen werden, könnte aber ein Ausgangspunkt sein.

Geben Sie hier die Bildbeschreibung ein

Eine Alternative ist das hinzugefügte variable Diagramm oder das partielle Regressionsdiagramm, das aus einer traditionellen Gaußschen Antwortregression besser bekannt ist. Diese sind in der Fahrzeugbibliothek implementiert. Effektiv zeigen sie die Beziehung zwischen dem, was von der Antwort übrig bleibt, und dem, was von einer der erklärenden Variablen übrig bleibt, nachdem der Rest der erklärenden Variablen ihren Beitrag sowohl zur Antwort als auch zu den erklärenden Variablen entfernt hat. Nach meiner Erfahrung finden die meisten nicht statistischen Zielgruppen diese etwas schwer einzuschätzen (könnte natürlich durch meine schlechten Erklärungen).

Geben Sie hier die Bildbeschreibung ein

#--------------------------------------------------------------------
# Simulate some data
n<-200
time <- rexp(n,.01)
complexity <- sample(1:5, n, prob=c(.1,.25,.35,.2,.1), replace=TRUE)
trueMod <- exp(-1 + time*.005 + complexity*.1 + complexity^2*.05)
defects <- rpois(n, trueMod)
cbind(trueMod, defects)


#----------------------------------------------------------------------
# Fit model
model <- glm(defects~time + poly(complexity,2), family=poisson)
# all sorts of diagnostic checks should be done here - not shown


#---------------------------------------------------------------------
# Two variables at once in a contour plot

# create grid
gridded <- data.frame(
    time=seq(from=0, to=max(time)*1.1, length.out=100),
    complexity=seq(from=0, to=max(complexity)*1.1, length.out=100))

# create predicted values (on the original scale)
yhat <- predict(model, newdata=expand.grid(gridded), type="response")

# draw plot
image(gridded$time, gridded$complexity, matrix(yhat,nrow=100, byrow=FALSE),
    xlab="Time", ylab="Complexity", main="Predicted average number of defects shown as colour and contours\n(actual data shown as circles)")
contour(gridded$time, gridded$complexity, matrix(yhat,nrow=100, byrow=FALSE), add=TRUE, levels=c(1,2,4,8,15,20,30,40,50,60,70,80,100))

# Add the original data
symbols(time, complexity, circles=sqrt(defects), add=T, inches=.5)

#--------------------------------------------------------------------
# added variable plots

library(car)
avPlots(model, layout=c(1,3))
Peter Ellis
quelle
2

Sie führen also eine Poisson-Regression für die Zähldatenvariable "Defekte" durch und möchten signifikante Unterschiede visualisieren. Was Sie tun, wenn Sie diese Regression schätzen, ist die Schätzung des bedingten MittelwertsE.[yich|xich]], wo yich sind die Mängel und xich sind Ihre Regressoren, wie Code-Komplexität.

Der einfachste Weg, dies zu visualisieren, besteht darin, nur zwei verschiedene Werte für zu verwenden xichB. hohe Komplexität und niedrige Komplexität, und zeichnen dann die vorhergesagte Häufigkeit von yich=0,yich=1usw. für beide Komplexitätsstufen. Das resultierende Histogramm aussehen würde dies auf Folie 3. Sind die Unterschiede stark sind, die histrograms dieser Frequenzen sehr unterschiedlich aussehen (zB viele Nullen für geringe Komplexität und viele hohe Mängel für hohe Komplexität). Es könnte gut aussehen, wenn Sie diese beiden Histogramme überlagern oder den Unterschied bei den vorhergesagten Fehlern darstellen.

Wenn Sie das Gefühl haben, Ihre zu reduzieren xich zu 2 Kategorien ist zu stark vereinfacht, Sie können das gleiche für jeden diskreten Satz von tun xichAber es ist keine gute visuelle Präsentation, wenn Sie mehr als beispielsweise 4 Grafiken gleichzeitig auf Ihr Publikum werfen.

Alternativ, wenn Ihr xich Ist dies kontinuierlich, können Sie abhängig davon eine vorhergesagte Anzahl (z. B. Fehler = 0) zeichnen xich. Vielleicht führt dies zu einer schönen monotonen Funktion, die Ihren Ergebnissen entspricht.

Übrigens: Haben Sie auch eine negative binomiale Regression für Ihre Daten durchgeführt? Sind die Ergebnisse sehr unterschiedlich? In diesem Fall ist Ihre Poisson-Annahme (bedingter Mittelwert gleich bedingter Varianz) möglicherweise zu restriktiv (siehe "Überdispersion"). Dies kann beispielsweise der Fall sein, wenn Ihre Variable "defekt" viele Nullen hat.

Namenlos
quelle