如何从循环中自动将行名添加到矩阵以标记模型中的预测变量和响应变量?

How can I automatically add rownames to a matrix from a loop to label the predictors and response variables in the model?

我是 运行 一个具有 8 个响应和 12 个预测变量的循环,因此我得到的结果矩阵由 96 个未标记的行组成。有没有一种方法可以让 R 根据插入模型的响应和预测变量自动为我标记这些行,而无需自己列出每个组合?这是我一直在使用的代码示例:

set.seed(0) 
set.seed(1)
dat <- gamSim(1,n=100,scale=2)
dat2 <- gamSim(1,n=100,scale=2)
names(dat2)[1:5]<-c("y1", paste0("x", 4:7))
d<-cbind(dat[, 1:5], dat2[, 1:5])
resp <- d[ c("y", "y1")]
pred <- d[, !(colnames(d) %in% c("y", "y1"))]

results<- vector("list", length=ncol(resp)*ncol(pred))
dim(results) <- c(ncol(resp), ncol(pred))

for(i in 1:ncol(resp)){
  for(j in 1:ncol(pred)){
    results[i, j][[1]] <- gamm(resp[, i] ~ s(pred[, j]))
  }
}
resultsl <- do.call("list", results)
pspline<-sapply(resultsl, function(l) summary(l$lme)$tTable[,5])
pspline2<-plyr::ldply(pspline, rbind)
pspline2

1  6.949984e-39
2  7.174833e-01
3  1.665304e-40
4  4.928242e-01
....

我希望这些行自动标记为 "y0-xo"、"y1-xo"、"yo-x1"、"y1-x1"...等,或以任何方式标记清除该行引用的响应和预测变量。在 运行 循环之前,我在结果矩阵中尝试了 dimnames 和 rownames 的不同迭代,但无法让它工作。有什么想法吗?

您可以在结果中存储每个公式的名称,并使用它们来命名矩阵的列:

for(i in 1:ncol(resp)){
  for(j in 1:ncol(pred)){
    results[i, j][[1]] <- mgcv::gamm(resp[, i] ~ s(pred[, j]))
    attr(results[i, j][[1]], "formula") <- paste(colnames(resp)[i],
                                                 colnames(pred)[j], sep = "-")                                       colnames(pred)[j], sep = "-"))
  }
}
resultsl <- do.call("list", results)
pspline<-sapply(resultsl, function(l) summary(l$lme)$tTable[,5])
colnames(pspline) <- sapply(resultsl, function(l) attr(l, "formula"))

> pspline
                         y-x0        y1-x0         y-x1        y1-x1         y-x2        y1-x2
X(Intercept)     1.889636e-40 1.072054e-35 4.272656e-47 1.179033e-35 5.963889e-53 1.004778e-35
Xs(pred[, j])Fx1 6.794519e-01 6.142264e-01 2.529175e-09 8.959402e-01 1.050719e-01 5.192141e-01
                         y-x3        y1-x3         y-x4        y1-x4         y-x5        y1-x5
X(Intercept)     2.021544e-40 1.110827e-35 2.030668e-40 1.560173e-36 2.020669e-40 1.709149e-39
Xs(pred[, j])Fx1 9.175815e-01 6.840799e-01 9.958544e-01 2.489406e-02 9.137317e-01 3.383139e-06
                         y-x6        y1-x6         y-x7        y1-x7
X(Intercept)     1.223498e-40 5.539263e-48 1.757977e-40 1.158747e-35
Xs(pred[, j])Fx1 2.731945e-01 1.911815e-02 5.586884e-01 8.059418e-01

我不确定您为什么在代码中使用 ldply 绑定矩阵。您最终得到的所有内容都在同一列中,没有用于区分 X(Intercept) 和 Xs(pred[ j]) 的标签。如果你只是想把它作为数据框的长格式,你可以使用 as.data.frame(t(pspline)):

> head(as.data.frame(t(pspline)))
      X(Intercept) Xs(pred[, j])Fx1
y-x0  1.889636e-40     6.794519e-01
y1-x0 1.072054e-35     6.142264e-01
y-x1  4.272656e-47     2.529175e-09
y1-x1 1.179033e-35     8.959402e-01
y-x2  5.963889e-53     1.050719e-01
y1-x2 1.004778e-35     5.192141e-01