我使用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)]<-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<-estim[i,j
]
Error in `[<-.data.frame`(`*tmp*`, i, j, value = c(0.0614055886960195, :
replacement has 7 rows, data has 1
任何帮助将不胜感激。
答案 0 :(得分:2)
您的'estim'数据框具有错误的维度,可以从“估算值”中保存长度为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'对象应该如何与“估计”结果对齐。)
答案 1 :(得分:0)
数据框estim
只有一列。该列恰好是一个矩阵。当您执行estim[i,j]
之类的操作时,您将访问数据框的列。我相信你实际上想要访问数据框内的矩阵。那么如果你想填充矩阵,那么你必须使用estim[1][,c(i,j)]
行的内容。