Comment ajuster une régression comme

9

J'ai des données de séries chronologiques où la variable mesurée est des entiers positifs discrets (comptes). Je veux tester s'il y a une tendance à la hausse dans le temps (ou non). La variable indépendante (x) est comprise entre 0 et 500 et la variable dépendante (y) est comprise entre 0 et 8.

J'ai pensé répondre à cela en ajustant une régression de la forme en y = floor(a*x + b)utilisant les moindres carrés ordinaires (OLS).

Comment pourrais-je procéder en utilisant R (ou Python)? Y a-t-il un package existant pour cela, ou suis-je mieux d'écrire mon propre algorithme?

PS: Je sais que ce n'est pas la technique idéale, mais je dois faire une analyse relativement simple que je peux réellement comprendre - mon expérience est la biologie et non les mathématiques. Je sais que je viole les hypothèses sur l'erreur dans la variable mesurée et l'indépendance des mesures dans le temps.

afaulconbridge
la source
5
Bien qu'il soit mathématiquement naturel d'essayer une régression de cette forme, derrière elle se cache une erreur statistique: le terme d'erreur sera désormais fortement corrélé avec la valeur prédite. C'est une violation assez forte des hypothèses OLS. Utilisez plutôt une technique basée sur le comptage, comme le suggère la réponse de Greg Snow. (J'ai cependant volontiers voté pour cette question, car elle reflète une réelle réflexion et intelligence. Merci de la poser ici!)
whuber

Réponses:

11

Vous pouvez adapter le modèle que vous énoncez en utilisant la fonction nls(moindres carrés non linéaires) R, mais comme vous l'avez dit, cela violera de nombreuses hypothèses et n'aura probablement pas beaucoup de sens (vous dites que le résultat prévu est aléatoire autour d'une étape fonction, et non des valeurs entières autour d'une relation qui augmente progressivement).

La façon la plus courante d'ajuster les données de comptage consiste à utiliser la régression de Poisson à l'aide de la glmfonction dans R, le premier exemple sur la page d'aide est une régression de Poisson, mais si vous n'êtes pas familier avec les statistiques, il serait préférable de consulter un statisticien pour vous assurer que vous faites les choses correctement.

Si la valeur de 8 est un maximum absolu (impossible de voir un nombre plus élevé, ce n'est pas seulement ce que vous avez vu), vous pouvez envisager la régression logistique des cotes proportionnelles, il existe quelques outils pour le faire dans les packages R, mais vous devrait vraiment impliquer un statisticien si vous voulez le faire.

Greg Snow
la source
"vous dites que le résultat prédit est aléatoire autour d'une fonction de pas, pas de valeurs entières autour d'une relation qui augmente progressivement" --- C'est quelque chose que je n'avais pas considéré. Au final, j'ai opté pour la régression de Poisson par glm. Ce n'est pas le choix parfait, mais "assez bien" pour ce dont j'avais besoin.
afaulconbridge
10

Il est clair que la suggestion de Greg est la première chose à essayer: la régression de Poisson est le modèle naturel dans beaucoup de béton situations.

Cependant, le modèle que vous proposez peut se produire par exemple lorsque vous observez des données arrondies: avec les erreurs normales iid .

Yi=axi+b+ϵi,
ϵi

Je pense que c'est intéressant de voir ce qu'on peut en faire. Je note le cdf de la variable normale standard. Si , alors utilisant des notations informatiques familières.FϵN(0,σ2)

P(ax+b+ϵ=k)=F(kb+1axσ)F(kbaxσ)=pnorm(k+1axb,sd=σ)pnorm(kaxb,sd=σ),

Vous observez des points de données . La vraisemblance de log est donnée par Ce n'est pas identique aux moindres carrés. Vous pouvez essayer de maximiser cela avec une méthode numérique. Voici une illustration dans R:(xi,yi)

(a,b,σ)=ilog(F(yib+1axiσ)F(yibaxiσ)).
log_lik <- function(a,b,s,x,y)
  sum(log(pnorm(y+1-a*x-b, sd=s) - pnorm(y-a*x-b, sd=s)));

x <- 0:20
y <- floor(x+3+rnorm(length(x), sd=3))
plot(x,y, pch=19)
optim(c(1,1,1), function(p) -log_lik(p[1], p[2], p[3], x, y)) -> r
abline(r$par[2], r$par[1], lty=2, col="red")
t <- seq(0,20,by=0.01)
lines(t, floor( r$par[1]*t+r$par[2]), col="green")

lm(y~x) -> r1
abline(r1, lty=2, col="blue");

modèle linéaire arrondi

En rouge et bleu, les lignes trouvées par maximisation numérique de cette vraisemblance, et moindres carrés, respectivement. L'escalier vert est pour trouvé par la probabilité maximale ... cela suggère que vous pourriez utiliser le moins de carrés, jusqu'à une traduction de par 0,5, et obtenir à peu près le même résultat; ou, que les moindres carrés correspondent bien au modèle où est l'entier le plus proche. Les données arrondies sont si souvent rencontrées que je suis sûr que cela est connu et a été étudié de manière approfondie ...ax+bax+ba,bb

Yi=[axi+b+ϵi],
[x]=x+0.5
Elvis
la source
4
+1 J'adore cette technique et j'ai soumis un article à ce sujet à un journal d'analyse des risques il y a quelques années. (Certains analystes des risques sont très intéressés par les données à intervalles.) Il a été rejeté comme étant «trop mathématique» pour leur public. :-(. Une astuce: lorsque vous utilisez des méthodes numériques, c'est toujours une bonne idée de fournir de bonnes valeurs de départ pour la solution. Pensez à appliquer OLS aux données brutes pour obtenir ces valeurs, puis "les polir" avec l'optimiseur numérique.
whuber
Oui, c'est une bonne suggestion. En fait, dans ce cas, je choisis des valeurs distantes pour souligner que "ça marche", mais dans la pratique votre suggestion serait la seule solution pour éviter de partir d'une région très plate, en fonction des données ...
Elvis