Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 双条件循环语法_R - Fatal编程技术网

R 双条件循环语法

R 双条件循环语法,r,R,如果之前有人回答过,我表示歉意,但我在任何地方都找不到答案。我有一个包含5个不同结果变量和10个不同解释变量的回归,因此我使用两个循环来运行模型,如下所示: 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=

如果之前有人回答过,我表示歉意,但我在任何地方都找不到答案。我有一个包含5个不同结果变量和10个不同解释变量的回归,因此我使用两个循环来运行模型,如下所示:

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]])
  }
}
for(i/1:长度(结果)){
用于(1中的j:长度(解释)){

reg[[i]]我认为这里的问题是您正在
j
循环中将公式分配给
reg[[i]]
。这意味着您将覆盖
reg[[i]]的每个值
i
循环的相同迭代过程中,在
j
循环中的每次
j
迭代中。您需要在列表中列出一个列表以实现所需的结果。下面是我认为您需要的示例

##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
##为假数据创建一些数据帧##

结果我认为这里的问题是,您正在
j
循环中将公式分配给
reg[[I]]
。这意味着您将覆盖
reg[[I]]的每个值
i
循环的相同迭代过程中,在
j
循环中的每次
j
迭代中。您需要在列表中列出一个列表以实现所需的结果。下面是我认为您需要的示例

##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
##为假数据创建一些数据帧##

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

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

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)
  }
}
所以,你得到了一个整洁的小数据框,里面有你所有的beta和它们对应的i和j值


你也可以在第一个循环中完成第二个循环,在第一个循环中你已经知道
i
j
,不必从模型名称中撬出它们。但是我试图尽可能接近你的解决方案。

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

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

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)
  }
}
所以,你得到了一个整洁的小数据框,里面有你所有的beta和它们对应的i和j值


您也可以在第一个循环中完成第二个循环,您已经知道
i
j
,不必从模型名称中撬出它们。但我尝试尽可能接近您的解决方案。

您是如何定义
reg
到底什么是
base.reg3
?这似乎没有创建出来在您的第一个循环中。它是data.frame吗?如果您包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,那么它会更容易帮助您。另外,在您的全局环境中使用
assign
来创建变量也不是一个好主意。如果您将结果放入适当的抱歉,它应该只说“reg”而不是“base.reg3”,我修正了这个问题。我正试图切换到使用列表,因为似乎每个人都同意这要容易得多。但我认为在这种情况下,如何使用I和j引用回归只是语法问题?您如何定义
reg
到底什么是
base.reg3
?这似乎不是在您的第一个循环中创建的。是吗t data.frame?如果您包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,那么它会更容易帮助您。此外,使用
assign
在您的全局环境中创建变量也不是一个好主意。如果您将结果放在适当的列表中,事情会容易得多。对此表示歉意只说“reg”而不是“base.reg3”,我修改了这个问题。我正试图切换到使用列表,因为似乎每个人都同意这要容易得多。但我认为在这种情况下,如何引用I和j的回归只是语法问题?非常感谢Martin!非常感谢Martin!