【问题标题】:How is the intercept computed in the GLM fit?GLM 拟合中的截距是如何计算的?
【发布时间】:2010-06-25 16:16:18
【问题描述】:

我一直在阅读 R 使用的 code 来拟合 广义线性模型 (GLM),因为 R 的源代码是免费提供的。所使用的算法称为迭代重加权最小二乘法 (IRLS),这是一种有据可查的算法。对于每次迭代,都会调用一个 Fortran 函数来解决加权最小二乘问题。

从最终用户的角度来看,例如,对于逻辑回归,R 中的调用如下所示:

y <- rbinom(100, 1, 0.5)
x <- rnorm(100)
glm(y~x, family=binomial)$coefficients

如果您不想使用 intercept,则这些调用中的任何一个都可以:

glm(y~x-1, family=binomial)$coefficients
glm(y~x+0, family=binomial)$coefficients

但是,我无法理解公式(即y~xy~x-1)在代码中的意义以及是否被理解为是否使用拦截。我正在寻找代码的一部分,其中一列将绑定到x,但似乎没有。

据我所知,出现在名为glm.fit 的函数中的布尔截距与我所指的截距不同。 偏移量也是一样。

关于glmglm.fit 的文档是here

【问题讨论】:

    标签: r formula intercept


    【解决方案1】:

    您可能找错地方了。通常,在拟合函数中首先调用model.matrix()

    > D <- data.frame(x1=1:4, x2=4:1)
    > model.matrix(~ x1 + x2, D)
      (Intercept) x1 x2
    1           1  1  4
    2           1  2  3
    3           1  3  2
    4           1  4  1
    attr(,"assign")
    [1] 0 1 2
    > model.matrix(~ x1 + x2 -1 , D)
      x1 x2
    1  1  4
    2  2  3
    3  3  2
    4  4  1
    attr(,"assign")
    [1] 1 2
    > 
    

    它是model.matrix() 的输出,它被传递给 Fortran。 lm() 和其他模型装配工就是这种情况。

    对于glm(),它是不同的,只有model.frame() 被调用,而没有添加拦截列。为什么会这样与广义线性模型和标准线性模型之间的差异有关,并且超出了本文的范围。

    【讨论】:

    • 这个答案的最后一段真的正确吗? glm.fit 采用模型矩阵 xlm.fit 中的完全相同...
    • 我回答这个问题已经有几年了,但我似乎记得在代码中查找过。我当然可能在任何方面都错了......
    猜你喜欢
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2018-05-02
    • 2018-09-09
    • 2023-03-17
    • 1970-01-01
    • 2018-01-12
    相关资源
    最近更新 更多