Тест согласия для степенного распределения в 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). Одним из входных параметров (скажем, x) будет переменная degree_dist (наблюдаемое распределение степеней сети). Другой входной параметр (скажем, 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).

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

Я не уверен, было ли вышеупомянутой ошибкой использование degree_dist для вычисления 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

person Community    schedule 04.02.2014    source источник
comment
Колмогорова-Смирнова - критерий согласия. Функция power.law.fit оценивает параметры степенного закона, которые наилучшим образом соответствуют заданному распределению (в терминах теста KS). Вы можете использовать значение KS.p, чтобы узнать, значительно ли отличается расчетное распределение от указанного. Итак, я не понимаю, почему вы хотите провести еще один тест на соответствие требованиям?   -  person Vincent Labatut    schedule 05.02.2014


Ответы (1)


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

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

Например, в R, как сказано в документации, следующий код получает данные из файла full_path_of_file_name, оценивает xmin и альфа и получает значение p, как предлагается Пункт и др. (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)              
person Ranaivo    schedule 14.02.2014