Совместная оценка параметров из двух NLS-регрессий - PullRequest
1 голос
/ 12 марта 2019

Прежде всего, я новичок в форуме, поэтому извините, если я не пишу этот пост самым оптимальным образом.

Кроме того, я пытаюсь использовать некоторые модели для оптимального времени входа для последующих поколений продуктов / услуг. Модели определяются следующим образом: Модели , где F (t): F (t) , S1 - совокупный объем продаж первого поколения продукта, S2 - совокупный объем продаж второго поколения продукта, а Tau2 - время внедрения второго продукта. поколение. M1, M2, q_g и p_q - параметры, которые необходимо оценить.

В литературе по этому вопросу предполагается, что q_g и p_g одинаковы для разных поколений продуктов, что означает, что q_g и p_g должны быть одинаковыми в модели для S1 и S2. Это где я столкнулся с неприятностями.

До сих пор я мог оценивать q_g и p_g индивидуально для каждого поколения, используя nls. Пожалуйста, смотрите ниже:

S1.cum.func <- nls(S1.cum ~ M1.cum * 
           ((1-exp(-(P.cum+Q.cum)*T))/((Q.cum/P.cum)*exp(-(P.cum+Q.cum)*T)+1)) #F1
          * ifelse(T2>0,(1-((1-exp(-(P.cum+Q.cum)*T2))/((Q.cum/P.cum)*exp(-(P.cum+Q.cum)*T2)+1))),One.vec)
          ,start=c(list(M1.cum=sum(S1.cum),P.cum=0.001,Q.cum=0.5))) #Start values 

S2.cum.func <- nls(S2.cum.new ~ (M2.cum + M1.cum*
                ((1-exp(-(P.cum2+Q.cum2)*T.new))/((Q.cum2/P.cum2)*exp(-(P.cum2+Q.cum2)*T.new)+1))) #F1(t)
               *((1-exp(-(P.cum2+Q.cum2)*T2.new))/((Q.cum2/P.cum2)*exp(-(P.cum2+Q.cum2)*T2.new)+1)) #F2(t-Tau2)
               ,start=c(list(M2.cum=1223000,P.cum2=0.001,Q.cum2=0.5)))

У меня вопрос: есть ли способ запустить регрессии на S1 и S2 одновременно, чтобы один набор оценочных параметров q_g и p_q описывал обе зависимые переменные в максимально возможной степени?

Большое спасибо.

1 Ответ

1 голос
/ 12 марта 2019

Вот пример, где мы запускаем fo1 и fo2 отдельно, а затем объединяем их, используя отдельные a1 и a2 и общий b. В следующий раз предоставьте пример complete , включающий все входные данные, чтобы можно было воспроизвести его с помощью копирования и вставки.

set.seed(123)

# Separate nls runs

x1 <- 1:10
y1 <- 1 + 2 * x1 + rnorm(10)
fo1 <- y1 ~ a1 + b1 * x1
nls(fo1, start = list(a1 = 0, b1 = 0))

x2 <- 11:20
y2 <- 4 * 2 * x2 * rnorm(10)   
fo2 <- y2 ~ a2 + b2 * x2       
nls(fo2, start = list(a2 = 0, b2 = 0))

# combined nls run with different a's and common b

y12 <- c(y1, y2)
fo12 <- y12 ~ c(a1 + b * x1, a2 + b * x2)   
nls(fo12, start = list(a1 = 0, a2 = 0, b = 0))
...