Hier, sur Twitter, @JF_Godbout partageait un joli graphique relatif aux élections québécoises, avec les nombres de votes obtenus (ici en pourcentage des votes totaux) et le pourcentage de sièges que cela donne,
Il faut dire qu’hier, c’était jour d’élection. Ce sont des élections à un tour, avec plusieurs partis (disons 4 grands partis si on se limite aux élections les plus récentes). Jusqu’à lundi, le PQ (Parti Québécois) avait une majorité (relative), et depuis lundi, le PLQ (Parti Libéral) est revenu au pouvoir. Et il y a à côté de ces deux grands partis d’autres partis, que l’on va regrouper. @JF_Godbout m’ayant envoyé ses données, j’ai pu reproduire les graphiques.
La grande différence ici, entre nos approches est – je pense – la méthode de lissage: alors que @JF_Godbout faisait des régressions locales, j’ai opté pour des splines.
reg=glm(Seat~bs(Election),data=d,family=binomial) yp=predict(reg,newdata=data.frame(Election=1970:2015),type="response")
J’utilise des splines parce que ça se généralise facilement à d’autres lois, et qu’on peut aussi les utiliser quand on régresse sur plusieurs variables continues. Si on rajoute les résultats de l’élection de lundi, on obtient le graphique suivant
Ce qui me gêne dans cette modélisation, c’est qu’on considère nos trois dernières régressions comme indépendantes…. alors que ce n’est pas le cas: on a trois modalités possibles, et la somme doit forcément faire 1. D’ailleurs, quand on somme les prédictions, on dépasse 1.
Avec deux partis, notre régression logistique nous garantie d’avoir une somme à un, mais plus ici. A moins d’utiliser un modèle multinomial. Si on oublie le lissage, l’idée est d’écrire
qui est tout simplement l’extension du modèle logistique. La difficulté technique est que, sous R, quand on fait une régression logistique, la variable d’intérêt doit être une variable prenant trois facteurs, et non pas un vecteur de probabilités. Au lieu d’utiliser des taux, ou des pourcentages, je devrais utiliser des nombres d’observations de chaque modalités. On va donc crééer une fausse base
> vote=data.frame( + plq=plq$Vote, + pq=pq$Vote, + autre=autre$Vote, + Election=pq$Election) > vote plq pq autre Election 1 0.5465 0.3022 0.1513 1972 2 0.3378 0.4137 0.2485 1976 3 0.4608 0.4926 0.0466 1981 4 0.5599 0.3869 0.0532 1985 5 0.4995 0.4016 0.0989 1989 6 0.4440 0.4475 0.1085 1994 7 0.4355 0.4287 0.1358 1998 8 0.4599 0.3324 0.2077 2003 9 0.3308 0.2835 0.3857 2007 10 0.4208 0.3517 0.2275 2008 11 0.3120 0.3195 0.3685 2012 12 0.4140 0.2538 0.3312 2014 > M=t(round(vote[,1:3]*1000)) > M [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] plq 546 338 461 560 500 444 436 460 331 421 312 414 pq 302 414 493 387 402 448 429 332 284 352 320 254 autre 151 249 47 53 99 108 136 208 386 227 368 331
On réplique alors autant de fois le nom du parti qu’on a de (pseudo) votes
> Y=X=NULL > for(i in 1:3){ + for(j in 1:ncol(M)){ + Y=c(Y,rep(c("PLQ","PQ","Autre")[i],M[i,j])) + X=c(X,rep(pq$Election[j],M[i,j])) + }} > basev=data.frame(Y=as.factor(Y),X=X)
C’est un peu artificiel, j’en conviens, mais ça marche… On peut alors faire la régression
> library(nnet) > regv=multinom(Y~bs(X),data=basev) # weights: 15 (8 variable) initial value 13186.643301 iter 10 value 12241.931805 final value 12221.591172 converged
et des prévisions
> ypv=predict(regv,newdata= + data.frame(X=1973:2014),type="probs") > ypv Autre PLQ PQ 1 0.18426281 0.4705415 0.3451957 2 0.16051060 0.4767408 0.3627486 3 0.14149153 0.4805514 0.3779571 4 0.12631826 0.4826100 0.3910718 5 0.11426236 0.4834165 0.4023212 6 0.10474046 0.4833543 0.4119053 7 0.09729304 0.4827117 0.4199953 8 0.09156246 0.4817016 0.4267360 9 0.08727323 0.4804776 0.4322491 10 0.08421535 0.4791477 0.4366370 11 0.08223095 0.4777835 0.4399855 12 0.08120364 0.4764292 0.4423672 13 0.08105030 0.4751066 0.4438431 14 0.08171457 0.4738203 0.4444651
Et on notera que cette fois, nos prévisions somment à un.
Cela dit, visuellement, on obtient des choses proches de ce qu’on avait auparavant,
mais intellectuellement, je trouve plus logique d’utiliser autre chose que des régressions logistiques quand on est dans une élection où plusieurs partis sont en compétition.