Qu'est-ce qu'une bonne visualisation pour les régressions de Poisson?

11

Je veux associer des défauts de code à des mesures de complexité de code comme la proximité. Un modèle courant consiste à considérer cela comme un processus de Poisson, où la durée correspond au temps passé à coder et la densité est fonction de la complexité du code. Je suis capable de faire une régression et d'obtenir des valeurs de signification, etc.

Cependant, il est difficile pour moi de visualiser les résultats (et encore plus difficile pour mes collègues moins enclins aux mathématiques). Y a-t-il un bon moyen de voir cela pour regarder des choses comme des valeurs aberrantes, si c'est une tendance linéaire, etc.? (Les liens vers les packages R sont appréciés.)

Par exemple, je pourrais simplement tracer Defects / Time ~ Complexitymais c'est assez bruyant et comme il Defectsest discrétisé et très petit, il est difficile de voir la tendance. Une chose à laquelle je pensais était que je pouvais découper les données en quantiles, puis faire une régression par quantile et tracer les densités résultantes - je ne suis pas certain de la validité de cela, d'autant plus que mes données ne sont pas normalement distribuées de sorte qu'elles pourraient induire les gens en erreur sur ce qu'est un quantile.

Xodarap
la source

Réponses:

6

Après avoir ajusté le modèle, pourquoi ne pas utiliser les défauts prévus comme variable pour les comparer aux autres en utilisant les techniques standard qui ont du sens pour eux? Il a l'avantage d'être une variable continue pour que vous puissiez voir même de petites différences. Par exemple, les gens comprendront la différence entre un nombre attendu de défauts de 1,4 et de 0,6, même s'ils arrondissent tous les deux à un.

Pour un exemple de la façon dont la valeur prédite dépend de deux variables, vous pouvez faire un tracé de contour du temps par rapport à la complexité comme les deux axes et la couleur et les contours pour montrer les défauts prédits; et superposer les points de données réels sur le dessus.

L'intrigue ci-dessous a besoin d'un peu de polissage et d'une légende, mais pourrait être un point de départ.

entrez la description de l'image ici

Une alternative est le graphique variable ajouté ou le graphique de régression partielle, plus familier d'une régression de réponse gaussienne traditionnelle. Ceux-ci sont implémentés dans la bibliothèque de voitures. En effet, ils montrent la relation entre ce qui reste de la réponse et ce qui reste de l'une des variables explicatives, après que les autres variables explicatives ont vu leur contribution à la fois à la réponse et aux variables explicatives supprimées. D'après mon expérience, la plupart des publics non statistiques trouvent cela un peu difficile à apprécier (cela pourrait bien sûr être dû à mes mauvaises explications).

entrez la description de l'image ici

#--------------------------------------------------------------------
# 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
la source
2

E[yje|Xje]yjeXje

Xjeyje=0,yje=1

XjeXje

XjeXje

BTW: avez-vous également effectué une régression binomiale négative sur vos données? Les résultats sont-ils très différents? Dans l'affirmative, votre hypothèse de Poisson (moyenne conditionnelle égale à la variance conditionnelle) pourrait être trop restrictive (voir «surdispersion»). Cela pourrait être le cas, par exemple, si votre variable "défaut" a plusieurs zéros.

Sans nom
la source