фонаформула модели для GLM регрессии с указанного пользователем семьей
Я пытаюсь предсказать продажи для линейки продуктов (y_test в образце в конце). Его продажи за временные периоды основаны на всех предыдущих продажах другого продукта (x_test) и сколько из этих предыдущих продаж все еще используется. Невозможно напрямую измерить количество ранее проданных продуктов, которые все еще используются, поэтому необходимо вывести кривую выживаемости.
Например, если вы делаете аксессуары для конкретной модели смартфона, продажа аксессуаров хотя бы частично зависит от количества используемых смартфонов. (Это не домашнее задание, BTW.)
Подробности
У меня есть некоторые данные временных рядов и хотели бы, чтобы соответствовать модели регрессии с использованием glm
или что-то подобное. Взаимосвязь между зависимой и независимой переменной заключается в следующем:
где р это период времени, у р является зависимой переменной, х р является независимой переменной, с и с - коэффициенты регрессии, F t представляет собой кумулятивную функцию распределения (например, pgamma
), а e p - это остатки.
За первый три периода времени, функция будет расширяться на что-то вроде этого:
#y[1] = c0 + c1*(x[1]*(1-integrate(function(q) {pgamma(q, c2, c2/c3)}, 0, 1)$value))
#y[2] = c0 + c1*(x[1]*(1-integrate(function(q) {pgamma(q, c2, c2/c3)}, 1, 2)$value) + x[2]*(1-integrate(function(q) {pgamma(q, c2, c2/c3)}, 0, 1)$value))
#y[3] = c0 + c1*(x[1]*(1-integrate(function(q) {pgamma(q, c2, c2/c3)}, 2, 3)$value) + x[2]*(1-integrate(function(q) {pgamma(q, c2, c2/c3)}, 1, 2)$value) + x[3]*(1-integrate(function(q) {pgamma(q, c2, c2/c3)}, 0, 1)$value))
Итак, у меня есть исторические данные для й р и у р, и я хочу, чтобы получить значения для коэффициентов/параметров с , гр , гр , и с , которые сводят к минимуму остаточных примесей.
Я думаю, что решение заключается в использовании glm
и создании пользовательской семьи, но я не уверен, как это сделать. Я посмотрел код для семейства Gamma
, но не очень далеко. Я смог сделать оптимизацию «вручную», используя nlminb
, но я бы предпочел простоту и полезность (т. Е. predict
и другие), предлагаемые glm
или аналогичные функции.
Вот несколько примеров данных:
# Survival function (the integral part):
fsurv<-function(q, par) {
l<-length(q)
out<-vapply(1:l, function(i) {1-integrate(function(x) {pgamma(x, par[1], par[1]/par[2])}, q[i]-1, q[i])$value}, FUN.VALUE=0)
return(out)}
# Sum up the products:
frevsumprod <- function(x,y) {
l <- length(y)
out <- vapply(1:l, function(i) sum(x[1:i]*rev(y[1:i])), FUN.VALUE=0)
return(out)}
# Sample data:
p<-1:24 # Number of periods
x_test<-c(1188, 2742, 4132) # Sample data
y_test<-c(82520, 308910, 749395, 801905, 852310, 713935, 624170, 603960, 640660, 553600, 497775, 444140) # Sample data
c<-c(-50.161147,128.787437,0.817085,13.845487) # Coefficients and parameters, from another method that fit the data
# Pad the data to the correct length:
pad<-function(p,v,padval=0) {
l<-length(p)
padv<-l-length(v)
if(padv>0) (v<-c(v,rep(padval,padv)))
return(v)
}
x_test<-pad(p,x_test)
y_test<-pad(p,y_test,NA)
y_fitted<-c[0+1]+c[1+1]*frevsumprod(x_test,fsurv(p,c[(2:3)+1])) # Fitted values from regression
library(ggplot2)
ggplot(data.frame(p,y_test,y_fitted))+geom_point(aes(p,y_test))+geom_line(aes(p,y_fitted)) # Plot actual and fit
Вы должны сделать резервную копию нескольких шагов и описать проблему ... не только ваши неудачные попытки решить ее. (Я полагаю, это может быть домашнее задание?) И, пожалуйста, не делайте SO-newb, чтобы отвечать на комментарии. Измените вопрос, пожалуйста. –
Спасибо @DWin. Я отредактировал вопрос, но до сих пор не получил никаких попыток ответить на него. Есть ли у вас другие предложения по улучшению вопроса? И BTW, я думаю, что почти все заявления о проблеме имеют отношение к любому потенциальному ответу, а не просто рассказ о моих «неудачных попытках». – dnlbrky
Я предлагаю вам отметить это с просьбой о переходе на CrossValidated. (... или вы могли бы просто переложить его туда с примечанием о том, что он не получил ответа на SO). –