Использование ошибок nlsLM и <длина 'dimnames' не равно экстенту массива>

Заданы точки измерения (y_i, t_i) (тогда как в этом минимальном примере y_i представляет собой только 3-мерный вектор (первоначально из R^6) и фиксированный момент времени t_i. Мне пришлось (не уверен, что код, как это прямо сейчас, это объясняется) применить метод Гаусса-Ньютона, чтобы минимизировать (двойную) сумму квадратов ошибок и найти параметры функций aj,cj в системе подбора (в коде, представленном функцией "fitFunc") Поскольку я продолжал получать Inf маленьких записей матрицы Якобиана в моей реализации C++, я гуглил для альтернативы и наткнулся на функцию nls в R (Поскольку я получил сингулярную градиентную матрицу 'errorwhenusing nls, я переключился на nlsLM)

Вот минимальный пример (только с N_0 и N_r, в то время как исходная система имеет 3 разных sumExp-подобных функции, N_0c и N_c, вызываемые в fitfunc):

library(stats)
a_param<-c(0.0294, 0.296, 0.0959)
c_param<-c(0.0574, 0.2960142, 0.3199)
time<-c(0,36,48,60,72,96)
N_srt<-55827

N_0 <- function(ti,cj) {N_srt*exp(-cj[1]*ti)}

prod_a<-function (i, aj){ #input i>=2 
                         p<-1   
                         j<-1
                         while (j<=i-1){ 
                                       p <-p*aj[j] 
                                       j<-j+1
                                       }
                         p
                         }

PaarProdukt<-function (j, i, cj){
                       p<-1
                       k<-1
                       while (k<=i){
                                   if (k!=j){ 
                                          p<-p*1/(cj[k]-cj[j])
                                          }
                                k<-k+1
                                }
                        p
                        }

 sumExp<-function(i, cj, ti){ #input i>=2
                             s<-0
                             j<-1

                             while (j <= i){
                                s<-s+exp(cj[j])*PaarProdukt(j,i,cj)
                                j<-j+1
                              }
                              s
                            } 


 N_r <- function(ti, i, cj, aj ){#i >2
                                P<-prod_a(i,aj) 
                                S<-sumExp(i,cj,ti)
                                2^(i-1)*N_srt*P*S 
                            }

      #-------------------
      givendata<-c(55827,0,0,
                   18283,12197,0,
                   11678,15635,19550,
                   6722,8315,13609,
                   5104,3316,6282,
                   715,915,1418)

# as I was annoyed with the fact, that R repliates the vector "time"    3 times so as to match its size with the size of "givendata", I introduced 
zeitSpane<-c(0,0,0,36,36,36,48,48,48,60,60,60,72,72,72,96,96,96)

  fitliste<-rep(0,18)

  fitFunc<-function(t,cj,aj){ #t muss be of length 18
  counter<-1

  while (counter <= 18){
    i <- counter %% 3
    if (i == 1){

      fitliste[counter]<-N_0(t[counter],cj)
      }else{
        if (i==0) {i<-3
        }else{i<-2}

      fitliste[counter]<-N_r(t[counter],i,cj,aj)+counter
      }
    counter<-counter+1
  }
  fitliste
}
df<- data.frame(givendata=givendata, t=zeitSpane )

nlsLM(givendata~fitFunc(t,cj,aj), data =df, start=list(t=zeitSpane,cj=c_param,aj=a_param))

Теперь я получил эту ошибку в colnames<-(*tmp*, value = c ("t", "cj", "aj")): длина 'dimnames' [2] не равна экстенту массива. Кроме того: Предупреждение: в матрице (out$hessian, nrow =length(unlist) (par))): длина данных [9] не является кратным или кратным числу строк [24]

Q: Знаете ли вы, как исправить эту ошибку? Откуда эта 9 в предупреждающем сообщении? Большое спасибо за любую идею!

0 ответов

Другие вопросы по тегам