как построить распределение степеней в R

Я хотел бы знать, может ли быть правильным вывод скрипта для построения графика распределения степеней.

Итак, скрипт (где вектор со степенями всех моих вершин хранится в x):

x is

x
 [1] 7 9 8 5 6 2 8 9 7 5 2 4 6 9 2 6 10 8 

x - степень определенной вершины сети - например, вершина 1 имеет степень 7, вершина 2 имеет степень 9 и т. д. x ‹- v2 summary(x)

library(igraph)
split.screen(c(1,2))
screen(1)
plot (tabulate(x), log = "xy", ylab = "Frequency (log scale)", xlab = "Degree (log scale)", main = "Log-log plot of degree distribution")
screen(2)
y <- (length(x) - rank(x, ties.method = "first"))/length(x)
plot(x, y, log = "xy", ylab = "Fraction with min. degree k (log scale)", xlab = "Degree (k) (log scale)", main = "Cumulative log-log plot of degree distribution")
close.screen(all = TRUE)
power.law.fit(x, xmin = 50)

Моя проблема в том, что логарифмический график кажется неверным - например, у меня есть степень «7» в целом 8 раз, поэтому не должна ли эта точка на логарифмическом графике стать 0,845 (логарифм 7)/0,903 (лог( 8) как в (х/у)?

Более того, может ли кто-нибудь сказать мне, как подогнать линию (степенной закон в логарифмической шкале) к графику на экране 2?


person Tim Heinert    schedule 23.01.2013    source источник


Ответы (1)


Я не знаком с пакетом igraph, поэтому не могли бы вы помочь с этим конкретным пакетом. Однако вот некоторый код для построения графиков распределения на логарифмическом графике. Сначала немного данных:

set.seed(1)
x = ceiling(rlnorm(1000, 4))

Затем нам нужно переставить, чтобы получить обратный CDF:

occur = as.vector(table(x))
occur = occur/sum(occur)
p = occur/sum(occur)
y = rev(cumsum(rev(p)))
x = as.numeric(names(table(x)))
plot(x, y, log="xy", type="l")

Дает

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

Что касается вашего вопроса о подгонке, я думаю, что несоответствие возникает из-за того, что igraph использует MLE, тогда как вы выполняете простую линейную регрессию (что не рекомендуется).


В качестве пробки я начал работу над пакетом для подгонки и построения степенных законов. Итак, используя этот пакет, вы получаете:

library(poweRlaw)

##Create a displ object
m = displ$new(x)
##Estimate the cut-off
estimate_xmin(m)
m$setXmin(105); m$setPars(2.644)

##Plot the data and the PL line
plot(m)
lines(m, col=2)

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

person csgillespie    schedule 23.01.2013
comment
как я могу произвести эти несоответствия? Есть простое объяснение? - person Tim Heinert; 23.01.2013
comment
извините, не могли бы вы объяснить это .. так что наблюдаемая закономерность верна? - person Tim Heinert; 23.01.2013