连接r函数中的多个步骤来计算beta值

时间:2016-08-25 00:39:57

标签: r statistics regression

我是r的新手(但我主要是在python中编写代码),我正在尝试为我自己的理解写下简单线性回归的代码,而我正在估算beta1

给出预测变量列x和响应y我想用伪代码做:

sum((x[i] - mean(x)) * (y[i] - mean(y)) / sum(x[i] - mean(x))^2

所以在r:

m <- rbind(c(2,3),c(1,2),c(0,3))) 

因为我读过for循环是魔鬼......我想也许我可以这样做:

beta1 <- function(x, y){
    c <- cbind(x,y)
    b1 <- apply(c, 2, function(v) v - mean(v))
    b1 <- b1[,1] * b1[,2]
    b1top <- sum(b1)
    b1bottom <- sum((x - mean(x))^2)
    b1 <- b1top / b1bottom
    return(b1)
}

beta1(m)
[1] 0

现在,撇开实施可能是错误的......根据函数内部的代码行,缩短工作量的方法是什么?

1 个答案:

答案 0 :(得分:1)

你说得对,因为循环很糟糕。如果你尽可能采用矢量化方法,你的方法已经非常快了(即你将x视为一个向量,只是通过从每个元素中减去x的平均值来做标量减法,而不是手动循环并在循环中减去)。这就是你在代码的后半部分所做的事情

您可以以相同的方式缩短代码的前半部分

因此,不是应用函数来减去均值,而是直接执行(例如x - mean(x))。这意味着你的分子可以像这样计算:

b1Top <- sum((x - mean(x)) * (y - mean(y)))
b1bottom <- sum((x - mean(x))^2)
b1 <- b1top / b1bottom

如果你有超过1个预测器,那么这个方法会变得有点沉重。另一种使用矢量化方法(使用矩阵)计算回归权重的方法。

可以使用原始数据中的矩阵运算完全计算回归权重。权重由下式给出:

regression

X是预测变量矩阵,Y是您的响应变量

首先,我们需要通过获取预测变量并为截距添加1列来创建预测变量/设计矩阵:

xData <- data.frame(1, x)
designMatrix <- data.matrix(xData)

接下来,我们计算交叉乘积矩阵(X'X):

的平方和
SSCP <- t(designMatrix) %*% designMatrix

然后反转它:

inverseSSCP <- solve(SSCP)

乘以设计矩阵的转置:

inverseMult <- inverseSSCP %*% t(designMatrix)

最后乘以Y向量:

betas <- inverseMult %*% y

原始方法并没有很好地扩展到多个预测因子,因为你将开始失去R的矢量化功能,所以当你到达那个阶段时,你最终会编写更多的代码行。矩阵方法允许您一次性计算所有预测变量的回归权重,无论有多少预测变量。