R - 具有不同数据帧中变量的线性线性回归

问题描述

我有 4 个大小相同的大矩阵 A,B,C 和 D 。每个矩阵有 n 个样本(列)和 n 个观测值(行)。

A <- structure(list(S1 = c(0L,0L,1L,1L),S2 = c(0L,0L),S3 = c(0L,1L)),class = "data.frame",row.names = c("Ob1","Ob2","Ob3","Ob4"))
#        S1  S2  S3
# Ob1     0   0   0
# Ob2     0   1   0
# Ob3     1   0   0
# Ob4     1   0   1

B <- structure(list(S1 = c(0L,8L,"Ob4"))
#        S1  S2  S3
# Ob1     0   0   0
# Ob2     1   8   0
# Ob3     1   0   0
# Ob4     1   0   1

C <- structure(list(S1 = c(0L,4L,S2 = c(2L,2L),"Ob4"))
#        S1  S2  S3
# Ob1     0   2   0
# Ob2     0   1   0
# Ob3     4   0   0
# Ob4     1   2   1

D <-  structure(list(S1 = c(0L,S2 = c(8L,5L,"Ob4"))
#        S1  S2 S3
# Ob1     0   8   0
# Ob2     0   1   0
# Ob3     4   5   0
# Ob4     1   0   1

每个矩阵包含一个不同的变量。我想对每个样本和矩阵的观察执行 4 个变量的线性回归。我不想要任何样本和观察值组合之间的线性回归,只是矩阵 A 中第 1 列和第 1 行形式的成对回归将与矩阵 B、C 和 D 中的第 1 列和第 1 行拟合;第 2 列和第 2 行与第 2 列和第 2 行,依此类推。

lm 模型:

lm(A ~ B * C + D)

我想要:

lm(A$S1_Obs1 ~ B$S1_Obs1 * C$S1_Obs1 + D$S1_Obs1)
lm(A$S1_Obs2 ~ B$S1_Obs2 * C$S1_Obs2 + D$S1_Obs2)
lm(A$S1_Obs3 ~ B$S1_Obs3 * C$S1_Obs3 + D$S1_Obs3)

lm(A$S2_Obs1 ~ B$S2_Obs1 * C$S2_Obs1 + D$S2_Obs1)
lm(A$S2_Obs2 ~ B$S2_Obs2 * C$S2_Obs2 + D$S2_Obs2)
lm(A$S2_Obs3 ~ B$S2_Obs3 * C$S2_Obs3 + D$S2_Obs3)

...

感谢任何帮助。

解决方法

我们可以使用 asplit 按行拆分,然后通过循环 Map 中的每个拆分元素来构建线性模型

out <- Map(function(a,b,c,d) lm(a ~ b * c + d),asplit(A,1),asplit(B,asplit(C,asplit(D,1))
,

这里是一种使用 purrr 包的方法,它也分配名称:

library(purrr)
seq_along(A) %>%
  map(~ lm(A[.] ~ B[.] * C[.] + D[.])) %>%
  set_names(map(seq_along(.),~ arrayInd(.x,dim(A)) %>%
                    paste(collapse = "_")))