Ngẫu nhiên hóa mạng lưới
Trong bài trước, bạn có thể đã nhận thấy độ dài đường đi trung bình của mạng Forrest Gump nhỏ hơn so với mạng ngẫu nhiên. Nếu bạn chạy mã vài lần, bạn sẽ thấy nó gần như luôn thấp hơn ở mạng Forrest Gump so với mạng ngẫu nhiên. Điều này gợi ý rằng mạng Forrest Gump liên kết chặt chẽ hơn từng mạng ngẫu nhiên, dù các mạng ngẫu nhiên có cùng số đỉnh và mật độ đồ thị gần như giống hệt. Thay vì chạy lại mã nhiều lần, bạn có thể tiếp cận chính quy hơn bằng cách tạo 1000 đồ thị ngẫu nhiên dựa trên số đỉnh và mật độ của đồ thị Forrest Gump gốc. Sau đó, bạn có thể xem có bao nhiêu lần độ dài đường đi trung bình của các đồ thị ngẫu nhiên nhỏ hơn mạng Forrest Gump gốc. Điều này được gọi là kiểm định ngẫu nhiên hóa (randomization test).
Đồ thị g và độ dài đường đi trung bình của nó (bạn đã tính ở bài trước), g.apl, đã có trong không gian làm việc của bạn.
Bài tập này là một phần của khóa học
Phân tích Mạng lưới trong R
Hướng dẫn bài tập
- Tạo 1000 đồ thị ngẫu nhiên từ đồ thị gốc
gbằng cách chạy đoạn mã tạo đối tượng danh sáchglvà vòng lặp for. - Tính độ dài đường đi trung bình của 1000 đồ thị ngẫu nhiên bằng
lapply(). Tạo vectorgl.aplsgồm 1000 giá trị này bằng cách chạy đoạn mã dùngunlist(). - Vẽ histogram của độ dài đường đi trung bình của 1000 đồ thị ngẫu nhiên bằng
hist()trên vectorgl.apls. Thêm một đường thẳng đứng màu đỏ, nét đứt vào biểu đồ bằngabline()với hoành độ là giá trị độ dài đường đi trung bình của đồ thị gốc,g.apl. - Tính tỷ lệ số lần giá trị độ dài đường đi trung bình của các đồ thị ngẫu nhiên
gl.aplsnhỏ hơn giá trị của đồ thị gốcg.apl. Về bản chất, đây là xác suất để chúng ta kỳ vọng quan sát được độ dài đường đi trung bình như vậy một cách ngẫu nhiên, khi biết mật độ và số đỉnh của đồ thị gốc.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
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(___ < ___)