我正在运行一个具有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"...etc,或者以任何方式清楚地表明该行引用的是哪个响应和预测器。在运行循环之前,我在结果矩阵中尝试了dimname和rowname的不同迭代,但不能正常工作。有什么想法吗?
发布于 2017-08-26 15:14:49
您可以将每个公式的名称存储在结果中,并使用它们来命名矩阵的列:
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-01https://stackoverflow.com/questions/45884890
复制相似问题