Проверка пригодности для определения степенного закона в R

У меня есть сеть, для которой я вписываюсь в степенной закон с помощью программного обеспечения igraph:

plf = power.law.fit(degree_dist, impelementation = "plfit")

Переменная plf теперь содержит следующие переменные:

$continuous
[1] TRUE
$alpha
[1] 1.63975
$xmin
[1] 0.03
$logLik
[1] 4.037563
$KS.stat
[1] 0.1721117
$KS.p
[1] 0.9984284

Руководство igraph объясняет эти переменные:

xmin = the lower bound for fitting the power-law
alpha =  the exponent of the fitted power-law distribution
logLik =  the log-likelihood of the fitted parameters
KS.stat =  the test statistic of a Kolmogorov-Smirnov test that compares the fitted  distribution with the input vector. Smaller scores denote better fit
KS.p = the p-value of the Kolmogorov-Smirnov test. Small p-values (less than 0.05) indicate that the test rejected the hypothesis that the original data could have been drawn from the fitted power-law distribution

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

Я думаю, что один из способов сделать это будет сделать chisq.test(x,y). Одним входным параметром (скажем, х) будет переменная степень_дист (наблюдаемое распределение степеней в сети). Другим входным параметром (скажем, y) было бы уравнение подобранного степенного закона, которое, как предполагается, имеет вид P(k) = mk^a.

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

В случае, если это помогает, степень_дист моей сети была:

 0.00 0.73 0.11 0.05 0.02 0.02 0.03 0.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00        0.01 0.00 0.00 0.00 0.01

(Это частоты, когда в сети встречались степени 0-21. (Например, 73% узлов имеют степень 1, 1% узлов имеют степень 21).

** * ** * *** РЕДАКТИРОВАТЬ ** * ** * ** * ****

Я не уверен, было ли это ошибкой при использовании степени_дистера для вычисления plf. В этом случае я также запустил ту же функцию, используя градусы из 100 узлов в моей сети:

plf = power.law.fit(pure_deg, impelementation = "plfit")

где pure_deg это:

  21  7  5  6 17  3  6  6  2  5  4  3  7  4  3  2  2  2  2  3  2  3  2  2  2  2  2  1  1  1  1  1  1 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 1

Это приводит к выводу:

$continuous
[1] FALSE
$alpha
[1] 2.362445
$xmin
[1] 1
$logLik
[1] -114.6303
$KS.stat
[1] 0.02293443
$KS.p
[1] 1

1 ответ

Есть пакет под названием powerRlaw in R от Колина Гиллеспи. Этот пакет хорошо документирован и содержит множество примеров использования каждой функции. Очень просто.

http://cran.r-project.org/web/packages/poweRlaw/

Например, в R, как сказано в документации, следующий код получает данные из файла full_path_of_file_name и оценивает xmin и alpha и получает p-значение, как предложено Clauset и al. (2009)

library("poweRLaw")

words = read.table(<full_path_of_file_name>)
m_plwords = displ$new(words$V1)         # discrete power law fitting
est_plwords = estimate_xmin(m_plwords)  # get xmin and alpha

# here we have the goodness-of-fit test p-value
# as proposed by Clauset and al. (2009)
bs_p = bootstrap_p(m_plwords)              
Другие вопросы по тегам