2

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

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

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

如果你不想使用拦截,这些调用中的任何一个都可以:

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

但是,我无法理解公式,即y~xor y~x-1,在代码中是如何有意义的,并且被理解为是否使用截距。我正在寻找一列将绑定到的代码的一部分x,但似乎没有。

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

关于glmandglm.fit的文档在这里

4

1 回答 1

6

你可能找错地方了。通常,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()被调用而不添加截距列。为什么会这样与广义线性模型和标准线性模型之间的差异有关,并且超出了本文的范围。

于 2010-06-25T16:29:22.673 回答