【问题标题】:Nested loop doesn't return expected values: Return model results from multiple recalculated independent variables嵌套循环不返回预期值:从多个重新计算的自变量返回模型结果
【发布时间】:2017-07-25 10:14:39
【问题描述】:

我想要一些关于我的嵌套循环的帮助,它没有返回我期望的值。我是嵌套循环的新手,所以请多多包涵。我想为基于原始变量的不同计算的逻辑回归模型计算一个新的自变量。具体来说,我有六个变量“x1...x6”,然后我通过从原始变量对中提取一个百分位数来创建三个新变量(newvar1、newvar2、newvar3)。然后从这三个新变量中,我通过减法将它们组合起来形成一个最终的新变量,该变量形成逻辑回归模型的自变量。然后由逻辑回归模型的 AIC 评估最终变量的值。

我需要确定形成 newvar2、newvar2 和 newvar3 的百分位值的最佳组合,这为我提供了最佳逻辑回归模型。为此,我尝试创建一个像这样的三层嵌套:

df <- data.frame(x1 <- rnorm(100),
             x2 <- rnorm(100),
             x3 <- rnorm(100),
             x4 <- rnorm(100),
             x5 <- rnorm(100),
             x6 <- rnorm(100),
             y <- as.factor(runif(100)<=.70))

n = 1
AIC = NULL
for (i in 0.1:n){
  for (j in 0.1:n){
    for (k in 0.1:n){
      df$newvar1 <-apply(df[,1:2], 1, quantile, probs = i, na.rm = T)
      df$newvar2 <-apply(df[,3:4], 1, quantile, probs = j, na.rm = T)
      df$newvar3 <-apply(df[,5:6], 1, quantile, probs = k, na.rm = T)
      df$finalvar <- df$newvar1 - df$newvar2 - df$newvar3
      model <- glm(y ~ finalvar, data = df, family = "binomial")
      AIC[i] <- as.numeric(model$aic)
    }
  }
}

我想为分位数函数的“probs”参数提供 11 个值(0、0.1、0.2....0.9,1)的序列,并且我想为每个可能的分位数参数估计(11*11*11)。因此最终的 AIC 变量应该是 121 个值的数值向量。但是,当我运行上述代码时,我得到 AIC 的空数值。我怎样才能让这段代码正常运行并为我提供所有可能的 121 模型的值?

谢谢!

编辑:这不是解决方案,但提供了我认为的部分答案。在我之前的代码中,“n”小于一,所以它只执行一次迭代,(显然)“n”需要大于一。之前它小于 1 的原因是 quantile 的“probs”参数需要一个介于 0 和 1 之间的值。超过这个,传递给参数 probs 的参数现在除以 10。现在使用 AIC[1] i可以得到一个10的向量,但我还是不明白如何得到代表所有组合的完整的10*10*10(或11*11*11)。

新代码:

 n = 10
 AIC = NULL
 for (i in 1:n){
   for (j in 1:n){
     for (k in 1:n){
       df$newvar1 <-apply(df[,1:2], 1, quantile, probs = i/10, na.rm = T)
       df$newvar2 <-apply(df[,3:4], 1, quantile, probs = j/10, na.rm = T)
       df$newvar3 <-apply(df[,5:6], 1, quantile, probs = k/10, na.rm = T)
       df$finalvar <- df$newvar1 - df$newvar2 - df$newvar3
       model <- glm(y ~ finalvar, data = df, family = "binomial")
       AIC[i] <- as.numeric(model$aic)
     }
   }
 }

【问题讨论】:

    标签: r parameter-passing nested-loops


    【解决方案1】:

    首先,AIC 是一个R 函数,所以我将名称更改为aic。 其次,在代码的最内层循环中,当您有 3 个索引时,您仅按 i 进行索引。所以也许这就是你真正需要的。

    n = 10
    aic = array(0, dim = c(n, n, n))  # changed
    for(...)
        for(...)
            for(...){
                [...]
                aic[i, j, k] <- as.numeric(model$aic)  # changed
            }
    

    【讨论】:

    • 谢谢,太好了!在最终的aic数组中,如何确定i、j、k分别对应哪个维度?
    • ij 先运行,然后是 k。例如,查看array(1:24, dim = 2:4) 的结果。
    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多