首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何自动将行名从循环添加到矩阵中,以标记模型中的预测变量和响应变量?

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

Stack Overflow用户
提问于 2017-08-25 23:33:44
回答 1查看 490关注 0票数 0

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

代码语言:javascript
复制
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的不同迭代,但不能正常工作。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-26 15:14:49

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

代码语言:javascript
复制
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))

代码语言:javascript
复制
> 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45884890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档