用户指定族的glm回归模型公式

时间:2013-03-15 14:13:30

标签: r formula regression glm

背景

我正在尝试预测产品系列的销售额(最后样本中的y_test)。它在一段时间内的销售额基于另一种产品(x_test)的所有先前销售额以及之前销售量中仍有多少仍在使用。虽然不可能直接测量仍在使用的先前销售产品的数量,因此需要推断出生存曲线。

例如,如果您为特定智能手机型号制作配件,则配件销售至少部分取决于仍在使用的智能手机的数量。 (这不是家庭作业,BTW。)

详情

我有一些时间序列数据,并希望使用glm或类似的东西拟合回归模型。依赖变量和自变量之间的关系是这样的: regression formula

其中p是时间段,y p 是因变量,x p 是自变量,c 0 和c < sub> 1 是回归系数,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))

所以,我有x p 和y p 的历史数据,我想得到系数/参数的值c 0 ,c 1 ,c 2 ,c 3 可以最大限度地减少残差。

我认为解决方案是使用glm并创建自定义系列,但我不知道该怎么做。我查看了{{1}的代码家人但没有走得太远。我已经能够使用Gamma“手动”进行优化,但我更喜欢nlminb或类似函数提供的简单性和实用性(即predict和其他)。

以下是一些示例数据:

glm

1 个答案:

答案 0 :(得分:1)

使用glm无法做到这一点。 family中的glm指定线性预测变量与y的平均值的关系。请参阅?familywiki。特别是,您需要能够使用(某些)函数编写family列表,如:

> fam <- poisson()
> str(fam)
List of 12
 $ family    : chr "poisson"
 $ link      : chr "log"
 $ linkfun   :function (mu)  
 $ linkinv   :function (eta)  
 $ variance  :function (mu)  
 $ dev.resids:function (y, mu, wt)  
 $ aic       :function (y, n, mu, wt, dev)  
 $ mu.eta    :function (eta)  
 $ initialize:  expression({  if (any(y < 0))  stop("negative values not allowed for the 'Poisson' family")  n <- rep.int(1, nobs| __truncated__
 $ validmu   :function (mu)  
 $ valideta  :function (eta)  
 $ simulate  :function (object, nsim)  
 - attr(*, "class")= chr "family"
> 
> fam <- Gamma()
> str(fam)
List of 12
 $ family    : chr "Gamma"
 $ link      : chr "inverse"
 $ linkfun   :function (mu)  
 $ linkinv   :function (eta)  
 $ variance  :function (mu)  
 $ dev.resids:function (y, mu, wt)  
 $ aic       :function (y, n, mu, wt, dev)  
 $ mu.eta    :function (eta)  
 $ initialize:  expression({  if (any(y <= 0))  stop("non-positive values not allowed for the 'gamma' family")  n <- rep.int(1, n| __truncated__
 $ validmu   :function (mu)  
 $ valideta  :function (eta)  
 $ simulate  :function (object, nsim)  
 - attr(*, "class")= chr "family"

其中eta指的是线性预测变量。即至少你需要指定反向链接函数linkinv,其中取决于通过参数和协变量之间的点积的共变量。你的不是因为它以非线性方式依赖于c_2和c_3。