【问题标题】:Combining nested for-loop outputs into a vector将嵌套的 for 循环输出组合成一个向量
【发布时间】:2013-01-31 12:12:49
【问题描述】:

我使用 3 个协变量拟合了一个多阶段马尔可夫 (MSM) 模型。我正在尝试应用一个函数,其主要参数适合 MSM 模型和协变量值。功能是:

transition<-qmatrix.msm(MSMmod,  ci="normal", covariates=list(grossTon= 10, activ=0, period=1))

这个函数的输出是估计值:

              Owning<10 Owning10-40   Owning>40        left
Owning<10   -0.18037446  0.06140559  0.00000000 0.118968868
Owning10-40  0.01609661 -0.09027454  0.04502546 0.029152476
Owning>40    0.00000000  0.04801757 -0.05137377 0.003356196
left         0.00000000  0.00000000  0.00000000 0.000000000

我只对其中的一些感兴趣,所以transition$estimates[c(5,2,10,7,13,14,15)] 我得到了;例如,函数 qmatrix.msm 使用协变量组合 GrossTon=120、active=0 和 period=1 给出的值(见下文)。

[1] 0.06140559 0.01609661 0.04502546 0.04801757 0.118968868 0.029152476 0.003356196

在我的函数中使用两个 for 循环,我期望得到 48 个向量(每个 7 个值,类似于前一个),因为 GrossTon(12 个值)和 activ(4 个值)的所有组合,因此最终将它们全部组合成一个向量(336 个值,7*12*4)。

这是我的功能:

transRate<-function(period){
  estim<-data.frame(matrix(rep(0,336),336,1))

  for(i in seq(10,120,by=10)){
    for(j in seq(0,3, by=1)){

    estim[c(i,j)]<-qmatrix.msm(msm.Mult4,  ci="normal", covariates=list(grossTon=i, activ=j, period=period))$estimates[c(5,2,10,7,13,14,15)]
    outp[c(i,j)]<-c(estim[c(i,j)])#Here I'm trying to get my 336 values vector
    }
  }

  grosTvect<-sort(rep(seq(10,120,by=10),28))
  rate<-rep(c("q12","q21","q23","q32","q14","q24","q34"),48)
  estimRate<-data.frame(grosTvect,rate,outp)

  return(estimRate)                     
} 
dataFrame<-transRate(period=1)

我不知道如何处理 i 和 j 来生成我的向量。

我在写estim[c(i,j)] 时遇到以下错误 和outp[c(i,j)]&lt;-c(estim[c(i,j)])

error in `[<-.data.frame`(`*tmp*`, c(i, j), value = c(0.0614055886960195,  : 
  new columns would leave holes after existing columns

当我写 estim[i,j]outp&lt;-estim[i,j 时,这个其他的]

Error in `[<-.data.frame`(`*tmp*`, i, j, value = c(0.0614055886960195,  : 
  replacement has 7 rows, data has 1

任何帮助将不胜感激。

【问题讨论】:

  • Rafael,你有一个很好的问题开始,但是你能添加更多关于你的函数应该产生的向量的信息吗?您当前的代码是否出现某种错误?
  • 希望现在更清楚了。

标签: r for-loop


【解决方案1】:

您的“估计”数据框的尺寸错误,无法容纳来自“估计”的长度为 7 的向量。您也没有声明“outp”,因此如果解释器代码在允许数据帧分配成功后到达那里,那将引发另一个错误。 (目前尚不清楚您为什么要采取额外的步骤来分配给“outp”。)

使用名为c("q12","q21","q23","q32","q14","q24","q34") 的列创建一个 48 行数据帧并使用顺序索引分配给正确的行 = i+12*j 会更容易吗?

 transRate<-function(period){
  estim<-data.frame(q12=1:48, q21=0, q23=0, q32=0, q14=0, q24=0, q34=0)))

  for(i in seq(1,12)){
    for(j in seq(0,3, by=1)){

    estim[ i+12*j , ] <- qmatrix.msm(cav.msm,  ci="normal", 
              covariates=list( grossTon = i*10, activ=j, period=period))$
                                                  estimates[c(5,2,10,7,13,14,15)]
       }
  }

    return(estim)                     
} 

dataFrame<-transRate(period=1)

(无法弄清楚具有不同尺寸的“grosTvect”对象应该如何与“估计”结果对齐。)

【讨论】:

    【解决方案2】:

    数据框estim 只有一列。这一列恰好是一个矩阵。当您执行estim[i,j] 之类的操作时,您正在访问数据框的列。我相信您实际上想要访问数据框内部的矩阵。因此,如果您想填充矩阵,则必须使用类似于 estim[1][,c(i,j)] 的内容。

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 2021-07-29
      相关资源
      最近更新 更多