含不完整网络属性的网络扩散自相关模型构建问题求助
问题概述
- 数据基础:持有一学期大学生的每日通话/短信数据、睡眠日志,已用
igraph构建包含参与者(约40名)和非参与者(数千名,如其他学生、家人)的社交网络 - 研究目标:验证睡眠行为(时长、作息规律等)是否通过社交网络扩散
- 方法选择:导师推荐使用自相关模型(替代同类研究常用的潜增长曲线模型)
- 核心障碍:仅参与者有睡眠数据,非参与者无有效属性值,导致网络属性缺失;已选择添加缺失值指示变量(因非参与者数量过多,未采用插补法),但计算Moran's I时频繁出现NA,运行自相关模型时报错
数据说明
node_attributes数据框:包含两列(names、node_attributes),非参与者的node_attributes为NAg2013F:igraph对象,涵盖2013年秋季学期参与者与非参与者的完整社交网络
现有代码及报错
# 创建缺失值指示变量 missing_indicator <- ifelse(is.na(node_attributes$node_attributes), 1, 0) # 计算Moran's I library(ape) library(igraph) adj_matrix <- as_adjacency_matrix(g2013F, sparse = FALSE) weights <- as.matrix(adj_matrix) moran_missingness <- Moran.I(missing_indicator, weights) print(moran_missingness) # 结果显示缺失值指示变量的Moran's I显著,说明缺失非随机 moran_i <- Moran.I(node_attributes$node_attributes, weights) print(moran_i) # 此处多得到NA值 # 将邻接矩阵转换为listw对象(空间权重) nb <- mat2listw(adj_matrix, style = "W", zero.policy = TRUE) # 警告信息:Warning- neighbour object has 2 sub-graphs library(spatialreg) # 创建包含缺失值指示变量的数据框 data <- data.frame(names = node_attributes$names, attribute = node_attributes$node_attributes, missing = missing_indicator) # 拟合空间滞后模型 lag_model <- lagsarlm(attribute ~ missing, data = data, listw = nb) summary(lag_model) # 报错信息:Error in subset.listw(listw, subset, zero.policy = zero.policy) : # Not yet able to subset general weights lists # 尝试用weights作为listw参数 lag_model <- lagsarlm(attribute ~ missing, data = data, listw = weights) summary(lag_model) # 报错信息:no neighborhood list # 尝试另一种方式 library(spdep) lag_model <- lagsarlm(node_attributes ~ 1, data = NULL, listw = lw) summary(lag_model) # 报错信息:invalid type (list) for variable 'node_attributes'
问题分析与修正方案
核心问题拆解
- Moran's I出现NA:全网络权重矩阵搭配大量NA的属性值,计算逻辑上无法生成有效结果,必须聚焦参与者子集计算
- 空间滞后模型报错:
listw对象与数据框的节点顺序不匹配,且直接传入邻接矩阵不符合lagsarlm的参数要求;同时纳入数千名非参与者会导致模型逻辑混乱、计算效率极低
修正代码示例
# 1. 提取参与者节点(过滤属性为NA的非参与者) participant_nodes <- node_attributes$names[!is.na(node_attributes$node_attributes)] # 2. 构建仅包含参与者的子网络 g_participant <- induced_subgraph(g2013F, vids = participant_nodes) # 3. 生成子网络的标准化邻接矩阵(行和为1,排除自连接) adj_participant <- as_adjacency_matrix(g_participant, sparse = FALSE) adj_participant <- adj_participant / rowSums(adj_participant, na.rm = TRUE) diag(adj_participant) <- 0 # 4. 提取参与者的睡眠属性 participant_attr <- node_attributes$node_attributes[!is.na(node_attributes$node_attributes)] # 5. 计算参与者子集的Moran's I moran_i_participant <- Moran.I(participant_attr, adj_participant) print(moran_i_participant) # 6. 转换为标准listw对象(确保节点顺序严格匹配) lw_participant <- mat2listw(adj_participant, style = "W", zero.policy = TRUE) # 7. 构建参与者专属数据框 data_participant <- data.frame(attribute = participant_attr) # 8. 拟合空间滞后模型(可按需添加控制变量,如性别、年级等) lag_model <- lagsarlm(attribute ~ 1, data = data_participant, listw = lw_participant, zero.policy = TRUE) summary(lag_model)
非参与者处理补充
若需考虑非参与者的间接影响,可将其转换为控制变量纳入模型:例如计算每个参与者连接非参与者的数量/比例,作为“社交暴露程度”变量加入滞后模型的自变量中,避免直接将无属性值的非参与者纳入网络分析。
内容的提问来源于stack exchange,提问作者Madelynn Wellons
相关产品推荐
相关产品推荐

