Régression pour un modèle de forme ?

22

J'ai un ensemble de données qui est des statistiques provenant d'un forum de discussion Web. J'examine la distribution du nombre de réponses qu'un sujet devrait avoir. En particulier, j'ai créé un ensemble de données qui contient une liste de nombres de réponses de sujets, puis le nombre de sujets qui ont ce nombre de réponses.

"num_replies","count"
0,627568
1,156371
2,151670
3,79094
4,59473
5,39895
6,30947
7,23329
8,18726

Si je trace l'ensemble de données sur un tracé log-log, j'obtiens ce qui est essentiellement une ligne droite:

Données tracées sur une échelle log-log

(Il s'agit d'une distribution Zipfian ). Wikipedia me dit que les lignes droites sur les parcelles log-log impliquent une fonction qui peut être modélisée par un monôme de la forme . Et en fait, j'ai regardé une telle fonction:y=uneXk

lines(data$num_replies, 480000 * data$num_replies ^ -1.62, col="green")

Modèle globe oculaire

Mes globes oculaires ne sont évidemment pas aussi précis que R. Alors, comment puis-je faire en sorte que R s'adapte plus précisément aux paramètres de ce modèle? J'ai essayé la régression polynomiale, mais je ne pense pas que R essaie d'ajuster l'exposant comme paramètre - quel est le nom propre du modèle que je veux?

Edit: Merci pour les réponses à tous. Comme suggéré, j'ai maintenant ajusté un modèle linéaire par rapport aux journaux des données d'entrée, en utilisant cette recette:

data <- read.csv(file="result.txt")

# Avoid taking the log of zero:
data$num_replies = data$num_replies + 1

plot(data$num_replies, data$count, log="xy", cex=0.8)

# Fit just the first 100 points in the series:
model <- lm(log(data$count[1:100]) ~ log(data$num_replies[1:100]))

points(data$num_replies, round(exp(coef(model)[1] + coef(model)[2] * log(data$num_replies))), 
       col="red")

Le résultat est le suivant, montrant le modèle en rouge:

Modèle ajusté

Cela ressemble à une bonne approximation pour mes besoins.

Si j'utilise ensuite ce modèle Zipfian (alpha = 1.703164) avec un générateur de nombres aléatoires pour générer le même nombre total de sujets (1400930) que l'ensemble de données mesuré d'origine contenu (en utilisant ce code C que j'ai trouvé sur le Web ), le résultat semble comme:

Résultats générés par un nombre aléatoire

Les points mesurés sont en noir, ceux générés aléatoirement selon le modèle sont en rouge.

Je pense que cela montre que la simple variance créée en générant aléatoirement ces 1400930 points est une bonne explication de la forme du graphique d'origine.

Si vous êtes intéressé à jouer vous-même avec les données brutes, je les ai publiées ici .

thenickdude
la source
2
Pourquoi ne pas simplement prendre des journaux des comptes et des nombres de réponses, et leur adapter un modèle linéaire standard?
gung - Rétablir Monica
3
Quel est cet énorme pic de chiffres juste en dessous de 10000 réponses?
Glen_b -Reinstate Monica
3
Ni les dénombrements ni les dénombrements logarithmiques n'ont une variance constante (pour les dénombrements, la variance augmentera avec la moyenne, pour les dénombrements logarithmiques, elle diminuera généralement avec la moyenne). Étant donné que les deux variables sont des nombres et que de nombreux nombres sont assez petits, je pencherais pour un GLM binomial Poisson, quasi-Poisson ou négatif, peut-être avec un log-link. Si vous devez utiliser une régression ordinaire, traitez au moins le problème de variance. Une autre alternative consiste à effectuer une transformation Anscombe ou Freeman-Tukey des nombres et à ajuster un modèle des moindres carrés non linéaires.
Glen_b -Reinstate Monica
1
Ce pic intéressant est dû à une "longueur de sujet maximale" imposée par l'homme dans plusieurs forums.
thenickdude
2
Le fudge est délicieux :) Plus prosaïquement, il n'y a pas de différence entre (num_replies + 1) et (num_posts_in_topic).
thenickdude

Réponses:

22

Votre exemple est très bon car il indique clairement des problèmes récurrents avec de telles données.

Deux noms communs sont la fonction de puissance et la loi de puissance. En biologie et dans certains autres domaines, les gens parlent souvent d'allométrie, surtout lorsque vous reliez des mesures de taille. En physique et dans d'autres domaines, les gens parlent de lois d'échelle.

Je ne considérerais pas monôme comme un bon terme ici, car j'associe cela à des puissances entières. Pour la même raison, il n'est pas préférable de le considérer comme un cas particulier d'un polynôme.

Les problèmes d'adaptation d'une loi de puissance à la queue d'une distribution se transforment en problèmes d'adaptation d'une loi de puissance à la relation entre deux variables différentes.

La façon la plus simple d'adapter une loi de puissance est de prendre les logarithmes des deux variables, puis d'ajuster une droite en utilisant la régression. Il y a de nombreuses objections à cela chaque fois que les deux variables sont sujettes à erreur, comme cela est courant. L'exemple ici est un cas d'espèce car les deux variables (et aucune) peuvent être considérées comme réponse (variable dépendante). Cet argument conduit à une méthode d'ajustement plus symétrique.

De plus, il y a toujours la question des hypothèses sur la structure des erreurs. Encore une fois, l'exemple ici est un cas d'espèce, car les erreurs sont clairement hétéroscédastiques. Cela suggère quelque chose de plus comme les moindres carrés pondérés.

Un excellent examen est http://www.ncbi.nlm.nih.gov/pubmed/16573844

Encore un autre problème est que les gens n'identifient souvent les lois de puissance que sur une certaine plage de leurs données. Les questions deviennent alors scientifiques aussi bien que statistiques, allant jusqu'à déterminer si l'identification des lois du pouvoir n'est qu'un vœu pieux ou un passe-temps amateur à la mode. Une grande partie de la discussion se déroule sous les titres de comportement fractal et sans échelle, avec une discussion associée allant de la physique à la métaphysique. Dans votre exemple spécifique, une petite courbure semble évidente.

Les amateurs de lois sur le pouvoir ne sont pas toujours égalés par les sceptiques, car les passionnés publient plus que les sceptiques. Je suggérerais qu'un diagramme de dispersion sur des échelles logarithmiques, bien qu'un tracé naturel et excellent qui est essentiel, devrait être accompagné de diagrammes résiduels d'une sorte pour vérifier les écarts par rapport à la forme de la fonction de puissance.

Nick Cox
la source
2
Merci, cela explique pourquoi je n'ai pas pu trouver quelque chose comme ça où les gens discutaient de "régression polynomiale". J'ai mis à jour ma question avec les résultats de l'adaptation de ce modèle!
thenickdude
Si vous recherchez une approche un peu plus rigoureuse de l'ajustement des lois de puissance et des tests de signification pour le modèle ajusté, vous voudrez probablement ce document: arxiv.org/abs/0706.1062 et le code d'accompagnement: tuvalu.santafe.edu/ ~ aaronc / powerlaws
Martin O'Leary
2
L'article cité ci-dessus concerne les distributions qui sont des lois de puissance, et non les relations entre les variables qui sont des lois de puissance. Le titre de cette question correspond mieux à cette dernière; l'exemple de cette question correspond mieux à la première.
Nick Cox
1

Si vous supposez qu'une puissance est un bon modèle pour s'adapter, vous pouvez l'utiliser log(y) ~ log(x)comme modèle et ajuster une régression linéaire en utilisant lm():

Essaye ça:

# Generate some data
set.seed(42)

x <- seq(1, 10, 1)

a = 10
b = 2
scatt <- rnorm(10, sd = 0.2)


dat <- data.frame(
  x = x,
  y = a*x^(-b) + scatt
)

Adapter un modèle:

# Fit a model
model <- lm(log(y) ~ log(x) + 1, data = dat) 
summary(model)

pred <- data.frame(
  x = dat$x,
  p = exp(predict(model, dat))
)

Créez maintenant un tracé:

# Create a plot
library(ggplot2)
ggplot() +
  geom_point(data = dat, aes(x=x, y=y)) +
  geom_line(data = pred, aes(x=x, y=p), col = "red")

entrez la description de l'image ici

Andrie
la source