R 语言简明速查

R 语言 速查 & 简明教程 #

结构 #

向量

1
2
3
4
5
6
7
8
9
cells <- c(1, 2, 5, -3)
rnames <- c("one", "two")
cnames <- c("C1", "C2")
c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)

a <- c("k", "j", "h", "a", "c", "m")
a[c(1, 3, 5)]  # [1] "k" "h" "c"
a[2:6]         # [1] "j" "h" "a" "c" "m" 

矩阵 matrix

1
2
3
4
mymatrix <- matrix(c(1,2,3,4), nrow=2,ncol=2,byrow=FALSE,dimnames=list(c(1,2), c(1,2)))

x[2,] # 第二行
x[,2] # 第二列

数组 array 数组(array)与矩阵类似,但是维度可以大于2。

1
2
3
4
5
myarray <- array(vector, dimensions, dimnames) 
dim1 <- c("A1", "A2")
dim2 <- c("B1", "B2", "B3")
dim3 <- c("C1", "C2", "C3", "C4")
z <- array(1:24, c(2, 3, 4), dimnames=list(dim1, dim2, dim3)) # 一个三维数组,很有意思

r 语言定义、语法 https://cran.r-project.org/doc/manuals/r-patched/R-lang.html

https://cran.r-project.org/doc/manuals/r-patched/R-intro.html#R-commands_003b-case-sensitivity-etc

ERGM 用法速查 #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 查看某个命令介绍
search.ergmTerms(search='triangle')

vignette('ergm-term-crossRef') http://127.0.0.1:30618/library/ergm/doc/ergm-term-crossRef.html


# 画图 Introduction to Exponential-family Random Graph Models with ergm

# 一、佛罗伦萨 婚况和财富的关系
# 1. 如下两图分别为附带姓名和附带财富标签的网络图
data(florentine) 
par(mfrow=c(1,2)) # Setup a 2 panel plot
plot(flomarriage,
    main="Florentine Marriage",
    cex.main=0.8,
    label = network.vertex.names(flomarriage))
wealth <- flomarriage %v% 'wealth' # %v% references vertex attributes
plot(flomarriage,
    vertex.cex=wealth/25,
    main="Florentine marriage by wealth", cex.main=0.8)

# 2. 拟合模型 estimate
flomodel.01 <- ergm(flomarriage ~ edges)
flomodel.02 <- ergm(flomarriage~edges+triangle)
flomodel.03 <- ergm(flomarriage~edges+nodecov('wealth'))
summary(flomodel.01) # Look at the fitted model object
summary(flomarriage~edges+triangle) 

# 3. 模拟模型 simulate,如下两图分别展示拟合结果和模拟结果,惊人一致
flomodel.03.sim <- simulate(flomodel.03,nsim=10)
attributes(flomodel.03.sim)

par(mfrow=c(1,2)) # Setup a 2 panel plot
plot(flomodel.03.sim[[1]],
    label= flomodel.03.sim[[1]] %v% "vertex.names",
    vertex.cex = (flomodel.03.sim[[1]] %v% "wealth")/25)
plot(flomarriage,
    label= flomodel.03.sim[[1]] %v% "vertex.names",
    vertex.cex = (flomodel.03.sim[[1]] %v% "wealth")/25)

# 4. Examining the quality of model fit – GOF
flomodel.03.gof <- gof(flomodel.03)
flomodel.03.gof


• calls to summary (to obtain measurements of network statistics on a dataset)
• calls to ergm (to estimate an ergm model)
• calls to simulate (to simulate networks from an ergm model fit)

# 二元分析
mcmc.diagnostics(fit)


并行计算 #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
library(ergm)
library(parallel)
library(doParallel)

# 获取可用的核心数量
num_cores <- detectCores() - 2  # 通常使用系统总核心数减去1,避免占满所有资源

# 使用 makeCluster 创建一个并行计算集群
cl <- makeCluster(num_cores)

# 注册集群,使其可以被并行任务使用
registerDoParallel(cl)

# 假设你有一个网络对象 'network_data' 和一些自定义的公式 'formula'
# 例如:network_data 是一个网络对象, formula 是 ERGM 模型公式

fit <- ergm(network_data ~ formula, control = control.ergm(MCMLE.maxit = 25, parallel = 4, parallel.type = "PSOCK")) 

在 ergm(Exponential Random Graph Models)模型中,节点属性(node-level covariates)是网络建模中非常重要的特征,可以用来捕捉节点之间相互联系的影响。除了你提到的 nodecov 和 nodefactor,ergm 还有很多其他函数用来表示节点的特定属性和交互。下面是常用的一些函数及其介绍:

  1. nodecov

    • 功能: 计算网络中的节点属性协变量,并将其作为网络统计量来建模。例如,节点的度数、权重或其他连续变量都可以通过这个函数引入。 • 语法: nodecov(attrname) • 示例: 如果网络中的每个节点都有一个年龄属性,你可以使用 nodecov(“age”) 来考察节点的年龄如何影响边的形成。

  2. nodefactor

    • 功能: 用于建模网络中节点的因子型属性(类别变量)。nodefactor 允许模型考虑同类节点之间形成边的倾向。不同类别的节点可能有不同的连接模式。 • 语法: nodefactor(attrname, base = NULL) • 示例: 假设你有一个表示性别的节点属性 “gender”,可以使用 nodefactor(“gender”) 来考察男性或女性节点在边形成中的影响。

  3. nodematch

    • 功能: 评估网络中相同属性类别的节点之间形成边的倾向,常用于衡量同质性。该函数考察是否同一类别的节点更容易相互连接。 • 语法: nodematch(attrname, diff = FALSE) • 示例: nodematch(“gender”) 表示查看性别相同的节点是否更容易形成边(即男性连接男性,女性连接女性)。diff = TRUE 会将不同类别分开建模。

  4. nodeicov 和 nodeocov

    • 功能: 分别用于有向网络中建模输入节点(nodeicov)和输出节点(nodeocov)的协变量。这些函数允许你分别对入边和出边的节点属性进行建模。 • 语法: nodeicov(attrname) 和 nodeocov(attrname) • 示例: 在一个有向网络中,如果节点有收入属性,可以使用 nodeicov(“income”) 来分析连接入点的节点收入如何影响入边形成。

  5. nodeifactor 和 nodeofactor

    • 功能: 分别用于有向网络中建模输入节点和输出节点的因子型属性。与 nodefactor 类似,nodeifactor 作用于连接的输入节点,nodeofactor 作用于连接的输出节点。 • 语法: nodeifactor(attrname, base = NULL) 和 nodeofactor(attrname, base = NULL) • 示例: 在有向网络中,nodeifactor(“status”) 可以查看入边节点的 status 属性如何影响网络结构。

  6. absdiff

    • 功能: 考察连接的两个节点在属性上的绝对差值是否影响它们形成边的倾向。适用于连续变量,例如收入、年龄等。 • 语法: absdiff(attrname) • 示例: absdiff(“age”) 用来分析节点的年龄差异对连接概率的影响,即年龄差异越大是否越难连接。

  7. nodemix

    • 功能: 类似于 nodematch,但用于不同类别的节点之间的混合情况。nodemix 允许同时建模同类节点和异类节点之间的连接模式。 • 语法: nodemix(attrname, base = NULL) • 示例: 如果网络节点有一个 “occupation” 属性,可以使用 nodemix(“occupation”) 来建模不同职业之间的节点如何相互连接(例如,医生与医生、医生与律师等的连接概率)。

  8. diff

    • 功能: 对节点的连续属性进行差值计算,并将其应用于模型。这与 absdiff 类似,但没有取绝对值。 • 语法: diff(attrname) • 示例: diff(“age”) 会分析节点之间的年龄差距如何影响边的形成,差距越大,连接可能性越小或越大。

  9. degree

    • 功能: 用来建模节点的度(degree),即节点连接的数量。可以设置一个范围或具体的度数来分析节点度数如何影响连接模式。 • 语法: degree(deg), 其中 deg 是度数。 • 示例: degree(1:3) 用来考察度数为 1 到 3 的节点连接模式。

  10. gwesp 和 gwdsp

    • 功能: 用于建模以三角形为中心的局部网络结构(闭合三元组)。这对于捕捉节点的三角关系或密集的本地连接至关重要。 • 语法: gwesp(decay = value) 和 gwdsp(decay = value) • 示例: gwesp(0.5) 表示研究局部闭合三元组(即三角形)的效应。

  11. isolates

    • 功能: 考察网络中的孤立节点(即度数为 0 的节点)。该统计量用于捕捉孤立节点在网络中的分布。 • 语法: isolates() • 示例: 使用 isolates() 来研究网络中有多少节点没有连接到任何其他节点。

  12. concurrent

    • 功能: 用于捕捉节点是否存在多个连接(即节点是否有多个相邻节点)。通常用于研究同时有多个合作关系的节点。 • 语法: concurrent() • 示例: concurrent() 会考察那些与多个其他节点形成连接的节点,并将其作为模型中的一部分。

  13. triangles

    • 功能: 用于研究网络中的三角形(即三元闭合关系)。三角形在社会网络分析中非常重要,因为它们反映了关系的密集性和网络的凝聚力。 • 语法: triangles() • 示例: triangles() 可以用来捕捉节点之间是否有三角关系(即三个人互相认识的关系)。

总结

•	连续变量: 可以使用 nodecov、nodeicov、nodeocov、absdiff 等函数建模。
•	分类变量: 可以使用 nodefactor、nodeifactor、nodeofactor、nodemix 等函数。
•	网络结构属性: 可以使用 degree、triangles、concurrent 等函数来捕捉网络结构和节点间的关系。
•	同质性与异质性: 使用 nodematch、nodemix 来建模节点间相同或不同类别的连接倾向。

这些函数结合起来,可以灵活地描述节点属性如何影响网络中的边结构,从而构建符合实际情况的 ERGM 模型。