4

在数据集上运行例如 cv.glmnet 会给我(默认情况下)100 个不同的模型。现在,如果我的数据集缺少数据,我可以进行多重插补(比如 10 次插补)并对每个插补运行 cv.glmnet。

如果我忽略每个模型的实际系数值,而只查看选定的特征(即列名集),一些模型是其他模型的子模型。

像这样的代码在某种程度上模仿了结果:

usevars<-paste("var", 1:100, sep="")
mdls<-replicate(1000, {
        numVars<-sample.int(length(usevars), 1)
        sample(usevars, numVars)
    })
names(mdls)<-paste("mdl", 1:1000, sep="")

现在,在这方面很容易获得子模型的父子关系。也可以只包括“直接父母身份”(即,如果模型 A 是 B 的孩子,而 B 是 C 的孩子,则不包括 A 和 C 之间的关系)。

最后,我来解决我的问题:我使用 igraph 来绘制这些模型及其(直接)关系。但是,我没有找到可以基于另一个变量(在本例中为模型大小)对节点进行分组的布局:在此设置中,创建此图似乎是一个好主意,其中包含具有相同模型的模型“带”大小(模型中的变量数)。

我最终做的,或多或少是通过一堆代码自己计算每个节点的位置(我不好意思在这里发布),但我一直想知道我是否只是错过了一个更好的/out-开箱即用的解决方案。

我自己的代码生成了这样的图表(您可以忽略颜色和标签 - 只知道水平轴包含模型大小): 在此处输入图像描述

非常感谢有关实现这种图表的建议,而不是自己完成所有艰苦的工作。

4

2 回答 2

1

igraph 开发版(即 0.6,尚未正式发布,但您可以在邮件列表中向 Gábor发一份)中的 Fruchterman-Reingold 布局算法有两个隐藏的(即尚未记录的)参数:minymaxy。它们允许您将节点的 Y 坐标限制在一个范围内,因此您可以使用它来创建图层。

或者,我现在正在为 igraph 实现 Sugiyama 分层图形布局方法,我将在一两天内将它合并到开发树中(如果进展顺利的话),然后你可以尝试一下。

于 2011-05-12T10:08:56.367 回答
1

您可以使用选项来约束 qgraph 中的 fruchterman-reingold 算法执行此操作。为了展示这一点,我首先创建了一个嵌套模型的小邻接矩阵:

adj <- matrix(0,9,9)

adj[1,2:4] <- 1
adj[2:4,5:7] <- 1
adj[5:7,8] <- 1
adj[8,9] <- 1 

mod <- c(1,rep(2,3),rep(3,3),4,5)

adj是邻接矩阵和mods包含模型级别(嵌套多远)的向量。

在您可以使用邻接矩阵上的函数qgraph绘制邻接矩阵的图形。qgraph()通过设置参数layout="spring",您可以调用 Fruchterman-Reingold 算法,并且layout.par可以为 Fruchterman-Reingold 提供参数列表。

使用该参数constraints ,我们可以为布局设置约束。这必须是一个包含 2 列的矩阵,每个节点都有一行。每行的第一个元素是 x 坐标,第二个元素是 y 坐标。如果它包含 NA,则表示该坐标可以自由移动,如果这是一个值,则表示该坐标固定在某个位置。

您必须在 y 位置的范围内尝试不同的方法才能看到最有效的方法。在这里,我只是将mod向量乘以节点数来获得一个好看的图形:

library("qgraph")
Lpar <- list(constraints = cbind(NA,nrow(adj)*mod))
L <- qgraph(adj,layout="spring",layout.par=Lpar)$layout

这里我们还将布局保存在一个对象L中,它也可以用作布局igraph

该模型

于 2011-05-12T14:22:29.577 回答