首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有两个条件的循环语法

具有两个条件的循环语法
EN

Stack Overflow用户
提问于 2021-05-18 02:56:57
回答 2查看 32关注 0票数 0

如果这个问题以前已经回答过了,我很抱歉,但我在任何地方都找不到答案。我有一个包含5个不同结果变量和10个不同解释变量的回归,所以我使用两个循环来运行模型,如下所示:

代码语言:javascript
复制
for(i in 1:length(outcome)){
    for(j in 1:length(explanatory)){
      reg[[i]] <- glm(as.formula(paste(outcome[i],"~",explanatory[j])), data=mydata, family=binomial)
      assign(paste0("reg", i, j), reg[[i]])
  }
}

这样,例如reg11是具有第一个结果和第一个解释变量的回归,例如reg 310是具有第三个结果和第十个解释变量的回归。

现在,我希望从每个回归中提取betas以创建新的数据帧,并使用以下方法:

代码语言:javascript
复制
for(i in 1:5){
  for(j in 1:10){
  betas <- reg[[i,j]]$"coefficients"
  }
}

然而,似乎[i,j]的语法是错误的。我已经尝试了[i,j],[i][j]和许多其他组合,但似乎都不起作用。我应该如何拼写它,这样R才能理解我所指的回归?

非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2021-05-18 03:40:07

我认为这里的问题是您在j循环中将公式赋给了reg[[i]]。这意味着,在j循环的相同迭代期间,您将在i循环中的每次迭代中覆盖reg[[i]]的每个值。你需要列表中的一个列表来实现你想要的结果。下面是我认为你想要的一个例子

代码语言:javascript
复制
##Creating some dataframes for fake data##
outcome<-as.data.frame(matrix(data=NA, nrow=5, ncol =10))
explanatory<-as.data.frame(matrix(data=NA, nrow=10, ncol =10))

##Functions to produce fake data##
obs.vars<-function(X){runif(10, 5, 100)}
resp.vars<-function(X){sample(c(0,1), 10, replace=TRUE)}

##Populating dataframes with fake data##
outcome<-apply(outcome, 2, resp.vars)  
explanatory<-apply(explanatory, 2, obs.vars)

##Create an empty list to save results of i loop##
reg<-NULL
##Looping to perform regressions
for(i in 1:ncol(outcome)){# i loop for response variables
  tmp<-list()#empty list to save results of j loop
    for(j in 1:ncol(explanatory)){# j loop for explanatory variables
    tmp[[j]]<- glm(outcome[,i]~explanatory[,j], family=binomial)# save regression model to jth element of tmp
    assign(paste0("reg", i, j), tmp[[j]])
    }#close j loop
  reg[[i]]<-tmp #save tmp list to ith element of reg 
}#close i loop

##Similar set up to extract coefficients from models##
##list to save results of i loop
betas<-NULL

#Looping to extract coefficients
for(i in 1:5){#i loop for response variables
  tmp<-NULL#empty list to save values from j loop
  for(j in 1:10){#j loop for explanatory variables
    tmp[[j]]<- cbind(reg[[i]][[j]]$"coefficients", data.frame(Exp_Var = j))
  }#close j loop 
  betas[[i]]<-cbind(data.frame(Obs_Var = i),do.call(rbind, tmp))#convert tmp to dataframe and save it to ith element of betas
}#close i loop
betas<-do.call(rbind, betas)# convert betas to dataframe

小心点,-Sean

票数 1
EN

Stack Overflow用户

发布于 2021-05-18 04:06:30

通过将具有不同j值的所有回归分配给相同的列表元素(reg[[i]]),您可以不断地覆盖旧的回归模型。对于i的每个值,只保留最后一个。

我将使用您将ij粘贴到标签以进行回归的逻辑,以有序的方式存储它们:

代码语言:javascript
复制
reg = list()
for(i in 1:length(outcome)){
    for(j in 1:length(explanatory)){
      label = paste("reg",i,"-",j,sep="")
      reg[[label]] <- glm(as.formula(paste(outcome[i],"~",explanatory[j])), data=mydata, family=binomial)
  }
}

因此,您会得到一个名为"reg1-1""reg3-10"的列表。现在,您可以遍历此列表。

  • POA:如果使用$-sign表示法访问系数元素,则不需要引号:

代码语言:javascript
复制
betas = c()
models = c()
ivals = c()
jvals = c()
for(model in names(reg)){
    coefs = reg[[model]][["coefficients"]]
    beta = coefs[2] ## Or wherever your beta of interest is located in the coefficients
    ij = strsplit(substr(model,4,nchar(model)),"-")[[1]] ## Get i and j from the name
    betas=c(betas,beta)
    models=c(models,model)
    ivals=c(ivals,ij[1])
    jvals=c(jvals,ij[2])
}

dta = data.frame("Model"=models,
                 "Beta"=betas,
                 "I"=ivals,
                 "J"=jvals)

所以,你得到了一个整洁的小数据框,里面有你的所有betas以及它们对应的i和j的值。

您还可以在第一个循环中执行完整的第二个循环,其中您已经知道ij,而不必从模型的名称中窥探它们。但我尽量接近你的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67575551

复制
相关文章

相似问题

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