Регрессия для модели формы

22

У меня есть набор данных, который является статистикой с форума веб-обсуждения. Я смотрю на распределение количества ответов, которые должна иметь тема. В частности, я создал набор данных, в котором есть список ответов на темы, а затем - количество тем с таким количеством ответов.

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

Если я нанесу набор данных на график log-log, я получу то, что в основном является прямой линией:

Данные представлены в масштабе log-log

(Это распределение Zipfian ). Википедия говорит мне, что прямые линии на графиках log-log подразумевают функцию, которая может быть смоделирована мономом вида . И на самом деле я оценил такую ​​функцию:Yзнак равноaИксК

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

Глазная модель

Мои глазные яблоки, очевидно, не так точны, как R. Итак, как я могу заставить R подгонять параметры этой модели для меня более точно? Я пробовал полиномиальную регрессию, но я не думаю, что R пытается вписать показатель степени в качестве параметра - как правильно назвать модель, которую я хочу?

Редактировать: Спасибо за ответы всех. Как и предполагалось, теперь я сопоставил линейную модель с журналами входных данных, используя этот рецепт:

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")

В результате мы видим модель красным цветом:

Подогнанная модель

Это выглядит как хорошее приближение для моих целей.

Если я затем использую эту модель Zipfian (альфа = 1.703164) вместе с генератором случайных чисел, чтобы сгенерировать то же общее количество тем (1400930), что и в исходном измеренном наборе данных (используя этот код C, который я нашел в Интернете ), результат будет выглядеть нравится:

Случайное число сгенерированных результатов

Измеренные точки выделены черным, случайным образом сгенерированные в соответствии с моделью - красным.

Я думаю, что это показывает, что простая дисперсия, созданная случайным образом генерированием этих 1400930 точек, является хорошим объяснением формы исходного графика.

Если вы хотите поиграть с необработанными данными самостоятельно, я разместил их здесь .

thenickdude
источник
2
Почему бы просто не взять журналы обоих показателей и num_replies и подогнать к ним стандартную линейную модель?
gung - Восстановить Монику
3
Что это за огромный всплеск чуть менее 10000 ответов?
Glen_b
3
Ни счетчики, ни лог-счет не имеют постоянной дисперсии (для счетчиков дисперсия будет увеличиваться со средним, для лог-счетов она обычно уменьшается со средним). Поскольку обе переменные являются счетчиками, а многие из них достаточно малы, я бы склонялся к пуассоновскому, квазипуассоновскому или отрицательному биномиальному GLM, возможно, с лог-связью. Если вы должны использовать обычную регрессию, хотя бы разберитесь с проблемой отклонений. Другая альтернатива состоит в том, чтобы выполнить преобразование отсчетов Анскомба или Фримена-Тьюки и подобрать нелинейную модель наименьших квадратов.
Glen_b
1
Этот интересный всплеск вызван вынужденной «максимальной длиной темы» на нескольких форумах.
thenickdude
2
Выдумка восхитительна :) Более прозаично, нет никакой разницы между (num_replies + 1) и (num_posts_in_topic).
thenickdude

Ответы:

22

Ваш пример очень хороший, потому что он ясно указывает на повторяющиеся проблемы с такими данными.

Два общих названия - степенная функция и степенной закон. В биологии и некоторых других областях люди часто говорят об аллометрии, особенно когда вы относитесь к измерениям размеров. В физике и некоторых других областях люди говорят о законах масштабирования.

Я не стал бы рассматривать моном в качестве хорошего термина, поскольку я ассоциирую это с целочисленными полномочиями. По той же причине это не лучше рассматривать как частный случай многочлена.

Проблемы подгонки степенного закона к хвосту распределения превращаются в проблемы подгонки степенного закона к отношениям между двумя различными переменными.

Самый простой способ подбора степенного закона - взять логарифмы обеих переменных, а затем выровнять прямую линию с помощью регрессии. Есть много возражений против этого, когда обе переменные подвержены ошибкам, как это обычно бывает. Пример здесь является показательным примером, поскольку обе переменные (и ни одна из них) могут рассматриваться как ответ (зависимая переменная). Этот аргумент приводит к более симметричному методу подгонки.

Кроме того, всегда возникает вопрос о предположениях о структуре ошибок. Опять же, пример здесь является тому примером, поскольку ошибки явно гетероскедастичны. Это предполагает нечто большее, как взвешенные наименьшие квадраты.

Один отличный обзор - http://www.ncbi.nlm.nih.gov/pubmed/16573844

Еще одна проблема заключается в том, что люди часто определяют законы власти только в некотором диапазоне своих данных. Затем вопросы становятся научными, а также статистическими, вплоть до того, является ли определение степенных законов просто желанным мышлением или модным любительским времяпрепровождением. Большая часть обсуждения возникает под заголовками фрактального и безмасштабного поведения, с соответствующими дискуссиями, начиная от физики до метафизики. В вашем конкретном примере небольшая кривизна кажется очевидной.

Энтузиасты силовых законов не всегда соответствуют скептикам, потому что энтузиасты публикуют больше, чем скептики. Я бы предложил, чтобы график рассеяния в логарифмических масштабах, хотя естественный и превосходный график, который является существенным, должен сопровождаться какими-то остаточными графиками для проверки отклонений от формы степенной функции.

Ник Кокс
источник
2
Спасибо, это объясняет, почему я не смог найти ничего подобного, где люди обсуждали «полиномиальную регрессию». Я обновил свой вопрос результатами подгонки этой модели!
thenickdude
Если вы ищете немного более строгий подход к подгонке степенных законов и тестам значимости для подобранной модели, вам, вероятно, понадобится этот документ: arxiv.org/abs/0706.1062 и сопровождающий код: tuvalu.santafe.edu/ ~ aaronc / powerlaws
Мартин О'Лири
2
Приведенный выше документ предназначен для распределений, являющихся степенными законами, а не отношений между переменными, являющимися степенными законами. Название этого вопроса подходит последнему лучше; Пример этого вопроса лучше подходит для первого.
Ник Кокс
1

Если вы предполагаете, что степень является хорошей моделью для подбора, то вы можете использовать ее в log(y) ~ log(x)качестве модели и подгонять линейную регрессию, используя lm():

Попробуй это:

# 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
)

Подходит модель:

# 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))
)

Теперь создайте сюжет:

# 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")

введите описание изображения здесь

Andrie
источник