【问题标题】:Regression model function (with user selected variables) on subset of data frame数据框子集上的回归模型函数(带有用户选择的变量)
【发布时间】:2017-10-17 16:42:26
【问题描述】:

使用来自 Fifththirtyeight 包的数据...

library(fivethirtyeight)
grads <- college_recent_grads

创建了 grads 数据的子集以包含所需的变量

data <- grads[, c("men", "major_category", "employed", 
"employed_fulltime_yearround", "p25th", 
"p75th", "total")]

然后,我将 data 子集按主要类别拆分,并省略了数据中的一个 NA 值

majorcats <- split(data, data$major_category)
names(majorcats)
majorcats <- majorcats %>% na.omit()

并尝试在名为facts的函数中运行回归模型,用户可以在其中指定x、y和z,z是主要类别(因此我将data子集按major_category拆分)

facts <- function(x, y, z){
   category <- majorcats[["z"]]
   summary(lm(y ~ x, data = category))
 }

不幸的是,当我尝试将变量输入到事实中时(这是主要数据集的一部分,例如

facts(men, p25th, Arts)

我收到以下错误:

Error in model.frame.default(formula = y ~ x, data = category, 
drop.unused.levels = TRUE) : 
  invalid type (NULL) for variable 'y'
Called from: model.frame.default(formula = y ~ x, data = category, 
drop.unused.levels = TRUE)
Browse[1]> 

谁能解释一下这个错误是什么意思,以及我可以如何解决它?

【问题讨论】:

    标签: r dataframe subset linear-regression


    【解决方案1】:

    只需将参数作为字符串文字传递并从字符串创建公式:

    facts <- function(x, y, z){
       category <- majorcats[[z]]
    
       model <- as.formula(paste(y, "~", x))
       # ALTERNATIVE: model <- reformulate(x, response=y)
       summary(lm(model, data = category))
     }
    
    facts("men", "p25th", "Arts")
    

    【讨论】:

    • 这似乎有效!您能否解释一下为什么会这样,尤其是model 的分配?
    • 由于您将动态值传递给函数,因此您需要构建公式。以前您的公式是y ~ xyx 都不在数据中,category。在这里,您运行 p25th ~ men 并且两者都在数据中。请记住 lm() 中的公式,从字面上查找这些符号。
    • 如果我在创建带有所需变量的data 子集后,对它们中的每一个都执行此操作:men &lt;- data$menmajor_category &lt;- data$major_category,等等我拥有的所有变量列为data 的一部分?如果我这样做,然后运行我原来的 facts 函数,我似乎没有收到错误。你能解释一下这两种方法的区别吗?
    • 你的公式是什么,仍然是y ~ x,你将什么传递给函数?实际的向量或字符串?您是在lm() 中使用了 data 参数还是将其留空?
    • 好吧,我还没有建立一个公式。我为data 中的每个变量创建了数据分离对象。在比较了两种方法的实际回归输出之后,我想我可以理解为什么我的初始方法没有意义了。由于没有公式,我只是从data 集合中运行回归,而不是在我想要的数据类别中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多