У меня есть сеть, для которой я вписываюсь в степенной закон с помощью программного обеспечения 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