在lm()中使用列编号而非列名

19

我希望可以通过列编号而不是名称来指定模型的列,例如lm(bp~height+age, data=mydata)

我尝试过lm(mydata[[1]]~mydata[[2]]+mydata[[3]])但问题在于:拟合模型中的系数被命名为mydata[[2]]mydata[[3]]等,而我想要使用真正的列名称。

也许这是一个无法两全其美的情况,但如果专家们能够提供是否可能的建议,我将非常感激。


1
如果您能稍微提供更大的背景信息,例如“您尝试解决的问题是什么”,那么您可能会得到更好的答案。 - Ben Bolker
感谢您的评论。我有一个数据框架中有大量列。我正在使用各种技术,包括逐步选择,使用其中部分列来拟合线性模型。如果可以的话,当调用lm()时,通过编号引用这些列会很方便,但我希望模型能显示列名。 - LeelaSella
1
我会根据这些名称拼凑一个基于公式的代码,就像这个链接中所示:https://dev59.com/vFnUa4cB1Zd3GeqPdb-q#6878461 - Ben Bolker
如果您想出一个好的解决方案,我们允许(并鼓励)您在自己的问题下发布答案... - Ben Bolker
2个回答

34
lm(
    as.formula(paste(colnames(mydata)[1], "~",
        paste(colnames(mydata)[c(2, 3)], collapse = "+"),
        sep = ""
    )),
    data=mydata
)

你可以使用任意数量的索引值(不需要for循环)来代替c(2,3)


1
第三行末尾缺少逗号吗? - Ben Bolker
谢谢,@Ben。另外,也许使用as.formula会更加健壮,虽然对于lm()来说不是必需的(但对于其他模型可能需要)。 - Tomas
谢谢。这明确了Ben Bolker之前提出的建议,并且完美地运作。 - LeelaSella
为了使这完全傻瓜化,我需要在列名周围添加反引号,因为名称中有特殊字符:paste('\',colnames(mydata)[c(2,3)],'`',sep =" ",collapse = "+")` - Evertvdw

2
lm(mydata[,1] ~ ., mydata[-1])

我在一门关于R的课程中发现了一个技巧,就是删除响应列,否则你会收到警告“基本完美拟合:摘要可能不可靠”。我不知道为什么它起作用,它并没有在文档中说明。通常,我们会保留响应列。

Tomas提供的早期答案的简化版本:

lm(
    as.formula(paste(colnames(mydata)[1], "~ .")),
    data=mydata
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接