2013-01-31 2 views
1

Я установил многоступенчатую марковскую модель (MSM), используя 3 ковариата. Я пытаюсь применить функцию, основными аргументами которой являются модель 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 

С как для петель в моей функции я ожидаю получить 48 вектора (7 значения каждый, аналогичный предыдущей) в результате всех комбинаций grossTon (12 значений) и эк (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

Рафаэль, у вас есть хорошее начало вопроса, но можете ли вы добавить дополнительную информацию об объекте, который ваша функция должна производить? И вы получаете какую-то ошибку с вашим текущим кодом? – Dinre

+0

Надеюсь, теперь яснее. – Rafael

ответ

2

Ваша «оценочная» датафрейма имеет неправильные размеры для хранения вектора длины-7 из «оценок». Вы также не объявляете «outp», поэтому, если код интерпретатора когда-либо появлялся после разрешения назначения dataframe, это могло бы вызвать еще одну ошибку. (Не понятно, почему вы все равно делаете дополнительный шаг при присвоении «outp».)

Было бы проще сделать 48-строчный фрейм с столбцами с именем c("q12","q21","q23","q32","q14","q24","q34") и просто назначить правильную строку = 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 с различными размерами должен был выстраиваться с «оценками» результаты.)

+0

Отличный !! Это сработало. Большое спасибо за вашу помощь. – Rafael

0

данных кадра estim имеет только один столбец. Этот столбец является матрицей. Когда вы делаете что-то вроде estim[i,j], вы получаете доступ к столбцам фрейма данных. Я считаю, что вы действительно хотите получить доступ к матрице внутри фрейма данных. Итак, вам нужно будет что-то использовать по строкам estim[1][,c(i,j)], если вы хотите заполнить матрицу.

Смежные вопросы