Рандомизация сетей
В предыдущем упражнении вы могли заметить, что средняя длина пути в сети «Форрест Гамп» оказалась меньше, чем в случайной сети. Если запускать код несколько раз, можно убедиться, что это верно почти всегда. Это говорит о том, что сеть «Форрест Гамп» более тесно связана, чем случайные сети, — несмотря на то что у них одинаковое количество вершин и практически одинаковая плотность графа. Вместо того чтобы многократно перезапускать код, можно провести более строгую проверку: сгенерировать 1000 случайных графов на основе числа вершин и плотности исходного графа «Форрест Гамп», а затем подсчитать, в скольких случаях средняя длина пути случайных графов окажется меньше, чем в исходной сети. Такой подход называется тестом рандомизации.
Граф g и его средняя длина пути g.apl (вычисленная в предыдущем упражнении) уже доступны в вашем рабочем пространстве.
Это упражнение является частью курса
Анализ сетей в R
Инструкции к упражнению
- Сгенерируйте 1000 случайных графов на основе исходного графа
g, выполнив код, который создаёт объект-списокglи циклfor. - Вычислите среднюю длину пути для 1000 случайных графов с помощью
lapply(). Создайте векторgl.aplsиз этих 1000 значений, выполнив код с функциейunlist(). - Постройте гистограмму средних длин путей для 1000 случайных графов с помощью
hist(), применив её к векторуgl.apls. Добавьте на график красную вертикальную пунктирную линию с помощьюabline(), задав в качестве точки пересечения с осью X значение средней длины пути исходного графа —g.apl. - Вычислите долю случаев, когда средняя длина пути случайных графов
gl.aplsоказывается меньше значения исходного графаg.apl. По сути, это вероятность того, что наблюдаемая средняя длина пути могла возникнуть случайно при заданной плотности и числе вершин исходного графа.
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
library(igraph)
# Generate 1000 random graphs
gl <- vector('list', 1000)
for(i in 1:1000){
gl[[i]] <- erdos.renyi.game(n = gorder(g), p.or.m = gd, type = "gnp")
}
# Calculate average path length of 1000 random graphs
gl.apls <- unlist(lapply(gl, ___, directed = FALSE))
# Plot the distribution of average path lengths
___(gl.apls, xlim = range(c(1.5, 6)))
abline(v = ___, col = "red", lty = 3, lwd = 2)
# Calculate the proportion of graphs with an average path length lower than our observed
mean(___ < ___)