与广义线性模型示例相关的混淆

机器算法验证 广义线性模型
2022-04-01 19:51:57

我正在阅读与广义线性模型相关的文章: http ://en.wikipedia.org/wiki/Generalized_linear_models 。它举了一个具体的例子

普通线性回归将给定未知量(响应变量、随机变量)的期望值预测为一组观察值(预测变量)的线性组合。这意味着预测变量的恒定变化导致响应变量的恒定变化(即线性响应模型)。当响应变量具有正态分布时(直观地说,当响应变量可以在没有固定“零值”的任一方向上基本上无限地变化时,或更一般地对于仅变化相对较小量的任何量,例如人类高度)。

但是,这些假设不适用于许多类型的响应变量。例如,在许多情况下,当响应变量必须为正并且可以在很大范围内变化时,恒定的输入变化会导致几何变化而不是不断变化的输出变化。例如,预测每升高 10 度会导致 1,000 多人前往给定海滩的模型不太可能很好地概括小海滩(例如,在较低温度下预期游客人数为 50 人的海滩)和大海滩(例如那些在较低温度下预期出席人数为 10,000 的人)。更糟糕的问题是,由于该模型还暗示,温度下降 10 度会导致前往特定海滩的人数减少 1000 人,在较高温度下,预计出勤率为 50 的海滩现在预计出勤率不可能达到 -950!从逻辑上讲,一个更现实的模型将改为预测海滩游客人数增加的恒定速率(例如,增加 10 度会导致海滩游客人数增加一倍,而下降 10 度会导致游客人数减半)。这种模型称为指数响应模型(或对数线性模型,因为预测响应的对数会线性变化)。

我实际上没有得到给出的例子。对于两种不同类型的海滩,我将有两种不同的模型。

对于大海滩

y = 1000x

对于小海滩

y = 50x

因此,如果 x 增加 10,y 将在两个海滩中受到相应的影响。我没有得到他们想要做什么。任何澄清?

他们已经给出了,如果他们使用指数函数,比如eXb它将解决问题。但我不知道怎么做。假设温度 X=1,b=1,否则假设 y = 2.7183。现在假设温度升高了 10 度。那么它将是e11= 5.9874e+04。响应没有加倍,他们看起来像这样。

我很困惑。

2个回答

我的技术含量较低的解释:实际上,您正在接近他们的答案。您意识到大海滩的公式不适用于小海滩,因此您制作了第二个模型。但是这些模型都不适用于中等海滩,所以你添加了第三个。这些都不适用于巨大的海滩,因此您添加了第四个。如果你很挑剔,你最终也会得到微型、中型和超大型海滩的模型。

为什么模型泛滥?如果你每一个都计算人口增加 1 度,然后从最小到最大绘制它们,你会发现它不是线性的。它是指数的,它的斜率随着大小的增加而增加。(你已经看到了50x相对1000x.)

您的报价所描述的是一个乘法模型,它不是基于绝对值,而是基于百分比。这正是你想要做的(艰难的方式):x- 小海滩的百分比增长是一个小数字,而在大海滩它是一个很大的数字。您只是试图通过使用基于绝对值的增长模型来模仿这种基于百分比的增长。

编辑:想想你期望在世界上看到的行动和反应的组合:

  1. “如果温度升高1度,这个海滩的人数将增加约100人”
  2. “如果气温升高 1%,这个海滩的人数将增加大约 1%”
  3. “如果气温升高1度,这片海滩的人数将增加约1%”
  4. “如果气温上升1%,这个海滩的人数将增加约100人”

您提议您可以在任何情况下使用#1,但引用描述的是现实更接近于#2 的情况。

恒定输入的“几何”变化意味着它将以恒定的比例或因子而不是恒定的添加量变化。例如,如果旧值是yoldx上升 1,会有一个exp(β)- 倍数变化y. 也就是说,新ynew=exp(β)yold. 另一方面,如果变化是相加的,它会是ynew=yold+β反而。在您的示例中,您为 b 使用了错误的值(大概是 b1,请注意您还需要一个 b0)。尝试以下操作(在 R 代码中,如果它不透明,请告诉我):

> b1 = 0.06931472   # this is the appropriate b1, not b1=1
> b0 = 1-b1         # here I make the constant
> X  = 1            
> exp(b0 + b1*X)    
[1] 2.718282        # this calculation gives you your original y
> X  = 11           # now we've incremented X by 10, 
> exp(b0 + b1*X)    
[1] 5.436564        # and y has doubled
> X  = 21           # we can go up by another 10, 
> exp(b0 + b1*X)    
[1] 10.87313        # and y doubles again

这是创建自己的示例的快速方法:

> y1 = 2.7183           # this is the number you want y to be when X=1
> foldIncrease = 2      # this is the multiple by which you want y to go up
> y2 = y1*foldIncrease  # now we've created y_new
> xUnits = 10           # this is the number of units that X will go up to get to y_new

> b1 = (log(y2)-log(y)) / xUnits   
> b1                    
[1] 0.06931472          # now we've calculated the appropriate b1
> b0 = log(y1)-b1       
> b0                    
[1] 0.930692            # this gives us the appropriate value for b0