首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为R在in中配置一个网络?

如何为R在in中配置一个网络?
EN

Stack Overflow用户
提问于 2019-04-04 19:35:35
回答 1查看 656关注 0票数 2

我试图在R中为蒙特卡洛程序编写一个代码,我的目标是估计一个度量的重要性,一个加权的,单边的,无向的网络,为包igraph格式化的。

到目前为止,我在代码中包括了以下步骤:

1.建立加权的单向无向网络,并计算观察到的卢万模量。

代码语言:javascript
复制
nodes <- read.delim("nodes.txt")
links <- read.delim("links.txt")
anurosnet <- graph_from_data_frame(d=links, vertices=nodes, directed=F) 
anurosnet

modularity1 = cluster_louvain(anurosnet)
modularity1$modularity #observed value 

obs=modularity1$modularity
obs
real<-data.frame(obs)
real

2.创建空向量

代码语言:javascript
复制
Nperm = 9 #I am starting with a low n, but intend to use at least 1000 permutations
randomized.modularity=matrix(nrow=length(obs),ncol=Nperm+1)
row.names(randomized.modularity)=names(obs)
randomized.modularity[,1]=obs 
randomized.modularity

3.对保持其特征的原始网络进行了置换,计算了所有随机网络的Louvain模性,并在向量中进行了计算。

代码语言:javascript
复制
i<-1
while(i<=Nperm){ 

  randomnet <- rewire(anurosnet, with=each_edge(0.5)) #rewire vertices with constant probability
  E(randomnet)$weight <- sample(E(anurosnet)$weight) #shuffle initial weights and assign them randomly to edges

  mod<-(cluster_louvain(randomnet))

  mod$modularity

  linha = mod$modularity

  randomized.modularity[,i+1]=linha
  print(i)
  i=i+1
}
randomized.modularity #Here the result is not as expected

4.根据随机值的分布绘制观测值。

代码语言:javascript
复制
niveis<-row.names(randomized.modularity)
for(k in niveis)
{
  if(any(is.na(randomized.modularity[k,]) == TRUE))
  {
    print(c(k, "metrica tem NA"))
  } else {
    nome.arq<- paste("modularity",k,".png", sep="")
    png(filename= nome.arq, res= 300, height= 15, width=21, unit="cm")
    plot(density(randomized.modularity[k,]), main="Observed vs. randomized",)
    abline(v=obs[k], col="red", lwd=2, xlab="")
    dev.off()
    print(k)
    nome.arq<- paste("Patefield_Null_mean_sd_",k,".txt", sep="")
    write.table(cbind(mean(randomized.modularity[k,]),sd(randomized.modularity[k,])), file=paste(nome.arq,sep=""), 
                sep=" ",row.names=TRUE,col.names=FALSE)
  }
}

5.估计P值(显着性)

代码语言:javascript
复制
significance=matrix(nrow=nrow(randomized.modularity),ncol=3)
row.names(significance)=row.names(randomized.modularity)
colnames(significance)=c("p (rand <= obs)", "p (rand >= obs)", "p (rand=obs)")

signif.sup=function(x) sum(x>=x[1])/length(x)
signif.inf=function(x) sum(x<=x[1])/length(x)
signif.two=function(x) ifelse(min(x)*2>1,1,min(x)*2)

significance[,1]=apply(randomized.modularity,1,signif.inf)
significance[,2]=apply(randomized.modularity,1,signif.sup)
significance[,3]=apply(significance[,-3],1,signif.two)

significance

第三步出了点问题,我预计向量会被10个值填充,但由于某种原因,它会在一段时间后停止。

插槽“mod$模块性”突然收到2个值,而不是1个。

代码开头提到的两个TXT文件可以从这里下载:

https://1drv.ms/t/s!AmcVKrxj94WClv8yQyqyl4IWk5mNvQ Pow5Tg2U7mjLw

你能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-05 20:06:51

您的错误是由于维度与您的randomized.modularity矩阵和一些随机模块化结果不匹配造成的。在您的示例中,您的矩阵最终是[1 x Nperm],但是,有时在排列过程中会返回2个模块化分数。要解决这个问题,我只需将结果存储在一个列表中。您的其他分析将需要调整,因为您有一个不匹配的模块化分数。

代码语言:javascript
复制
library(igraph)

nodes <- read.delim("nodes.txt")
links <- read.delim("links.txt")
anurosnet <- graph_from_data_frame(d=links, vertices=nodes, directed=F) 
anurosnet

modularity1 = cluster_louvain(anurosnet)
modularity1$modularity #observed value 

obs <- modularity1$modularity
obs
real<-data.frame(obs)
real

Nperm = 100 #I am starting with a low n, but intend to use at least 1000 permutations
#randomized.modularity <- matrix(nrow=length(obs),ncol=Nperm+1)
#row.names(randomized.modularity) <- names(obs)
randomized.modularity <- list()
randomized.modularity[1] <- obs 
randomized.modularity


for(i in 1:Nperm){ 

  randomnet <- rewire(anurosnet, with=each_edge(0.5)) #rewire vertices with constant probability
  E(randomnet)$weight <- sample(E(anurosnet)$weight) #shuffle initial weights and assign them randomly to edges

  mod <- (cluster_louvain(randomnet))      
  mod$modularity      
  linha = mod$modularity     
  randomized.modularity <- c(randomized.modularity, list(linha))

}

randomized.modularity

编写循环的更好方法

代码语言:javascript
复制
randomized.modularity <- lapply(seq_len(Nperm), function(x){  
                                            randomnet <- rewire(anurosnet, with=each_edge(0.5)) #rewire vertices with constant probability
                                            E(randomnet)$weight <- sample(E(anurosnet)$weight) #shuffle initial weights and assign them randomly to edges
                                            return(cluster_louvain(randomnet)$modularity)
                                          })
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55523684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档