НачатьНачать бесплатно

Рандомизация сетей

В предыдущем упражнении вы могли заметить, что средняя длина пути в сети «Форрест Гамп» оказалась меньше, чем в случайной сети. Если запускать код несколько раз, можно убедиться, что это верно почти всегда. Это говорит о том, что сеть «Форрест Гамп» более тесно связана, чем случайные сети, — несмотря на то что у них одинаковое количество вершин и практически одинаковая плотность графа. Вместо того чтобы многократно перезапускать код, можно провести более строгую проверку: сгенерировать 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(___ < ___)
Редактировать и запускать код