【问题标题】:R: how to pass in a reference to the variable in glm or lm?R:如何在 glm 或 lm 中传递对变量的引用?
【发布时间】:2016-06-20 11:37:23
【问题描述】:

假设我有一个命名向量:

sorted = c(1,2,3)
names(sorted) = c("A","B","C")

它将如下所示:

> sorted
A    B    C
1    2    3

所以这是一个名为 A,B,C 的向量,其值分别为 1,2,3。

我也有一个样本数据:

data.ex = as.data.frame(matrix(rep(c(1,2,3,4),3), nrow = 3, ncol = 3))
colnames(data.ex) = c("A","B","C")

所以这个数据框也有 3 列,分别命名为 A、B、C。

我只想通过 glm() 使用 A 中的值来预测 C:

fit.ex = glm(formula = C ~ names(sorted)[2],
         data = data.ex,
         family = binomial(link = "logit"))

但是,我会不断收到以下错误消息:

Error in model.frame.default(formula = C ~ names(sorted)[2], data = data.ex,: 
variable lengths differ (found for 'names(sorted)[2]')

我在这里阅读了这篇文章并找到了 as.name() 函数,但仍然无法正常工作: http://www.ats.ucla.edu/stat/r/pages/looping_strings.htm

我找不到与我的问题类似的任何其他内容。 请,如果有另一个线程解决这个问题,请指导我! 或任何形式的帮助将不胜感激! :)

【问题讨论】:

  • 这是你想要的 - glm(as.formula(paste("C ~", names(sorted)[2])), data=data.ex) 吗?
  • 奇怪的是,我不久前给加州大学洛杉矶分校的人发了一封电子邮件,指出他们网站上的代码过于复杂,而 models <- lapply(varlist, function(x) {lm(as.formula(paste("read ~",x)), data = hsb2)}) 就足够了。
  • 甚至forms <- lapply(varlist,reformulate,response="read"); lapply(lm,forms,data=hsb2) ?
  • @BenBolker - 整洁,但不是 lapply(forms,lm,data=hsb2) 吗?
  • @thelatemail 嗨,我尝试了您建议的代码(第一个),但会收到以下错误: eval 中的错误(expr,envir,enclos):y 值必须为 0

标签: r formula glm lm


【解决方案1】:

根据 cmets 提供答案:

sorted = c(A=1,B=2,C=3)
names(sorted) = c("A","B","C")
data.ex = data.frame(A=1:4,B=2:5,C=c(1,0,0,1))

构造一个公式列表:

forms <- lapply(names(sorted)[1:2],reformulate,response="C")
models <- lapply(forms,glm,data = data.ex,
                 family = binomial(link = "logit"))

然后你可以做类似的事情

t(sapply(models,coef))

plyr 包对于这类事情也很方便(例如plyr::ldply(models,coef)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 2021-03-14
    • 2020-02-13
    相关资源
    最近更新 更多