O que é uma boa visualização para regressões de Poisson?

11

Quero associar defeitos de código a métricas de complexidade de código, como proximidade. Um modelo comum é ver isso como um processo de Poisson, em que a duração é quanto tempo é gasto em codificação e a densidade é uma função da complexidade do código. Eu sou capaz de fazer uma regressão e obter valores de significância etc.

No entanto, é difícil para mim visualizar os resultados (e ainda mais difícil para meus colegas menos inclinados matematicamente). Existe uma boa maneira de ver isso para ver coisas como outliers, se é uma tendência linear etc.? (Links para pacotes R são apreciados.)

Por exemplo, eu poderia apenas traçar, Defects / Time ~ Complexitymas isso é bastante barulhento e, como Defectsé discreto e muito pequeno, é difícil ver a tendência. Uma coisa que eu estava pensando é que eu poderia dividir os dados em quantis e, em seguida, fazer uma regressão por quantil e plotar as densidades resultantes - não tenho certeza de quão válido isso é, especialmente porque meus dados não são normalmente distribuídos, portanto enganar as pessoas sobre o que é um quantil.

Xodarap
fonte

Respostas:

6

Depois de ajustar o modelo, por que não usar os defeitos previstos como uma variável para comparar com os outros usando quaisquer técnicas padrão que sejam significativas para eles? Tem a vantagem de ser uma variável contínua, para que você possa ver até pequenas diferenças. Por exemplo, as pessoas entenderão a diferença entre um número esperado de defeitos de 1,4 e 0,6, mesmo que ambos arredondem para um.

Para um exemplo de como o valor previsto depende de duas variáveis, você pode fazer um gráfico de contorno do tempo v. Complexidade como os dois eixos, cores e contornos para mostrar os defeitos previstos; e sobreponha os pontos de dados reais na parte superior.

A trama abaixo precisa de polimento e uma lenda, mas pode ser um ponto de partida.

insira a descrição da imagem aqui

Uma alternativa é o gráfico variável adicionado ou gráfico de regressão parcial, mais familiar a partir de uma regressão de resposta gaussiana tradicional. Estes são implementados na biblioteca do carro. Efetivamente, mostra a relação entre o que resta da resposta e o que resta de uma das variáveis ​​explicativas, depois que o restante das variáveis ​​explicativas teve sua contribuição para a resposta e as variáveis ​​explicativas removidas. Na minha experiência, a maioria dos públicos não estatísticos acha isso um pouco difícil de apreciar (poderia, pelas minhas más explicações, é claro).

insira a descrição da imagem aqui

#--------------------------------------------------------------------
# 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
fonte
2

Portanto, você executa uma regressão de Poisson na variável de dados de contagem "defeitos" e deseja visualizar diferenças significativas. O que você faz quando estima que a regressão é estimar a média condicional , onde são os defeitos e são seus regressores, como a complexidade do código.y i x iE[yi|xi]yixi

A maneira mais fácil de visualizá-lo é apenas dois valores diferentes para , por exemplo, alta complexidade e baixa complexidade, e depois plotar a frequência prevista de etc. para ambos os níveis de complexidade. O histograma resultante seria semelhante presente na corrediça 3. Se as diferenças são fortes, os histrograms dessas frequências será muito diferente (por exemplo, muitos zeros para baixo complexidade e muitos defeitos elevados para alta complexidade). Pode parecer legal você sobrepor esses dois histogramas ou plotar a diferença de defeitos previstos.y i = 0 , y i = 1xiyi=0,yi=1

Se você acha que reduzir seu para 2 categorias é uma simplificação excessiva, você pode fazer o mesmo com qualquer conjunto discreto de , mas isso não resulta em uma boa apresentação visual se você lançar mais de, digamos, 4 gráficos ao seu público ao mesmo tempo .x ixixi

Como alternativa, se o seu for contínuo, você poderá plotar uma contagem prevista (por exemplo, defeitos = 0) dependendo desse . Talvez isso resulte em uma bela função monótona que esteja alinhada com seus resultados.x ixixi

Btw: você também executou uma regressão binomial negativa nos seus dados? Os resultados são muito diferentes? Nesse caso, sua suposição de Poisson (média condicional igual à variação condicional) pode ser muito restritiva (consulte "superdispersão"). Pode ser o caso, por exemplo, se sua variável "defeito" tiver muitos zeros.

Sem nome
fonte