背景
我正在尝试预测产品系列的销售额(最后样本中的y_test)。它在一段时间内的销售额基于另一种产品(x_test)的所有先前销售额以及之前销售量中仍有多少仍在使用。虽然不可能直接测量仍在使用的先前销售产品的数量,因此需要推断出生存曲线。
例如,如果您为特定智能手机型号制作配件,则配件销售至少部分取决于仍在使用的智能手机的数量。 (这不是家庭作业,BTW。)
详情
我有一些时间序列数据,并希望使用glm
或类似的东西拟合回归模型。依赖变量和自变量之间的关系是这样的:
其中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
答案 0 :(得分:1)
使用glm
无法做到这一点。 family
中的glm
指定线性预测变量与y的平均值的关系。请参阅?family
和wiki。特别是,您需要能够使用(某些)函数编写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。