我在Stack Overflow上很多次看到了成对或一般的配对简单线性回归。这是一个用于这种问题的玩具数据集。
set.seed(0)
X <- matrix(runif(100), 100, 5, dimnames = list(1:100, LETTERS[1:5]))
b <- c(1, 0.7, 1.3, 2.9, -2)
dat <- X * b[col(X)] + matrix(rnorm(100 * 5, 0, 0.1), 100, 5)
dat <- as.data.frame(dat)
pairs(dat)
基本上,我们想计算5 * 4 = 20条回归线:
----- A ~ B A ~ C A ~ D A ~ E
B ~ A ----- B ~ C B ~ D B ~ E
C ~ A C ~ B ----- C ~ D C ~ E
D ~ A D ~ B D ~ C ----- D ~ E
E ~ A E ~ B E ~ C E ~ D -----
这里有一个“穷人”的策略:
poor <- function (dat) {
n <- nrow(dat)
p <- ncol(dat)
## all formulae
LHS <- rep(colnames(dat), p)
RHS <- rep(colnames(dat), each = p)
## function to fit and summarize a single model
fitmodel <- function (LHS, RHS) {
if (RHS == LHS) {
z <- data.frame("LHS" = LHS, "RHS" = RHS,
"alpha" = 0,
"beta" = 1,
"beta.se" = 0,
"beta.tv" = Inf,
"beta.pv" = 0,
"sig" = 0,
"R2" = 1,
"F.fv" = Inf,
"F.pv" = 0,
stringsAsFactors = FALSE)
} else {
result <- summary(lm(reformulate(RHS, LHS), data = dat))
z <- data.frame("LHS" = LHS, "RHS" = RHS,
"alpha" = result$coefficients[1, 1],
"beta" = result$coefficients[2, 1],
"beta.se" = result$coefficients[2, 2],
"beta.tv" = result$coefficients[2, 3],
"beta.pv" = result$coefficients[2, 4],
"sig" = result$sigma,
"R2" = result$r.squared,
"F.fv" = result$fstatistic[[1]],
"F.pv" = pf(result$fstatistic[[1]], 1, n - 2, lower.tail = FALSE),
stringsAsFactors = FALSE)
}
z
}
## loop through all models
do.call("rbind.data.frame", c(Map(fitmodel, LHS, RHS),
list(make.row.names = FALSE,
stringsAsFactors = FALSE)))
}
逻辑很清晰:获取所有配对,构建模型公式(reformulate
),拟合回归模型(lm
),进行总结统计(summary
),返回所有统计量并将它们用rbind
组成一个数据框。
好的,但是如果有p
个变量怎么办?那么我们需要做p * (p-1)
次回归!
我能想到的一种立即改进方法是使用多个LHS拟合线性模型。例如,该公式矩阵的第一列被合并到
cbind(B, C, D, E) ~ A
这将把回归的数量从p * (p - 1)
减少到p
。
但是,即使不使用lm
和summary
,我们也可以做得更好。这是我之前尝试过的:是否有一种快速估计简单回归的方法(仅具有截距和斜率的回归线)?。它很快,因为它使用变量之间的协方差进行估计,就像解决正规方程一样。但是那里的simpleLM
函数相当受限:
- 它需要计算残差向量来估计残差标准误差,这是性能瓶颈;
- 它不支持多个LHS,因此在成对回归设置中需要调用
p * (p - 1)
次。
我们能否编写一个pairwise_simpleLM
函数将其推广为快速成对回归呢?
常规配对简单线性回归
上述成对回归的更有用的变化是一组LHS变量和一组RHS变量之间的常规配对回归。
示例1
拟合LHS变量A
、B
、C
和RHS变量D
、E
之间的配对回归,即拟合6条简单线性回归线:
A ~ D A ~ E
B ~ D B ~ E
C ~ D C ~ E
示例 2
对于特定的RHS变量,例如: cbind(A, B, C, D) ~ E
,进行多个LHS变量的简单线性回归拟合。
示例 3
对于一个特定的LHS变量,逐一对一组RHS变量进行简单线性回归拟合,例如:
A ~ B A ~ C A ~ D A ~ E
我们还能为这个问题提供一个快速的函数 general_paired_simpleLM
吗?
注意事项:
- 所有变量必须是数字;因子是不允许的,否则成对回归没有意义。
- 加权回归不被讨论,因为方差-协方差方法在这种情况下无法证明合理性。
psych::corr.test
和Hmisc::rcorr
可以执行成对相关检验。特别地,它们可以在存在缺失数据时进行成对NA
删除。虽然我的pairwise_simpleLM
和general_paired_simpleLM
可用于相关检验(请参见“beta.pv”列的p值),但它无法处理成对NA
删除。 - Zheyuan Lipairwise_simpleLM
和general_paired_simpleLM
无法处理NA
。这需要在C/C++中实现整个函数。将来我会增强它们的功能以支持此能力。在C/C++实现中,还可以使用更稳定的数值方法来计算协方差。 - Zheyuan Li