【问题标题】:Model syntax in R: how to input dynamic variables?R中的模型语法:如何输入动态变量?
【发布时间】:2021-01-24 03:05:09
【问题描述】:

我想在 for 循环中运行线性模型(在本例中为具有两个响应变量的多元模型),其中在每次迭代时都会创建一个名为 bc_applied 的新数据框,以及向量 @987654323 @。在我的代码中,列名"target1""target2" 在每次迭代时都会发生变化,这意味着我不能显式编写变量名,而是想从向量targets 中提取它们。

这是一个例子:

targets <- c("target1","target2")
bc_applied <- data.frame("dsRNA" = c(rep("gene1",5),rep("gene2",5),rep("gene3",5)),
"target1" = runif(15), "target2" = runif(15))

但是在运行的时候

lm(bc_applied[,targets] ~ dsRNA, data = bc_applied)

返回如下错误:

Error in model.frame.default(formula = bc_applied[, targets] ~ dsRNA,  : 
  invalid type (list) for variable 'bc_applied[, targets]'

所需的输出由下式给出

lm(cbind(target1, target2) ~ dsRNA, data = bc_applied)

【问题讨论】:

    标签: r variables dynamic model


    【解决方案1】:

    根据?lm

    如果响应是矩阵,则线性模型通过最小二乘法分别拟合到矩阵的每一列。

    使用cbind,它正在创建一个matrix。所以,我们需要一个带有matrix 的选项。使用列对数据集进行子集化后,将其转换为 matrixas.matrix,它应该可以工作

    lm(as.matrix(bc_applied[,targets]) ~ dsRNA, data = bc_applied)
    

    -输出

    #Call:
    #lm(formula = as.matrix(bc_applied[, targets]) ~ dsRNA, data = bc_applied)
    
    #Coefficients:
    #             target1   target2 
    #(Intercept)   0.45161   0.47457
    #dsRNAgene2    0.36341   0.29226
    #dsRNAgene3   -0.07115  -0.03003
    

    或者另一种选择是使用paste创建一个公式

    lm(paste0('cbind(', toString(targets),') ~ dsRNA'), data = bc_applied)
    

    -输出

    #Call:
    #lm(formula = paste0("cbind(", toString(targets), ") ~ dsRNA"), 
    #    data = bc_applied)
    
    #Coefficients:
    #             target1   target2 
    #(Intercept)   0.45161   0.47457
    #dsRNAgene2    0.36341   0.29226
    #dsRNAgene3   -0.07115  -0.03003
    

    或使用glue 创建formula

    lm(glue::glue('cbind({toString(targets)}) ~ dsRNA'), bc_applied)
    

    或者其他选项是

    lm(do.call(cbind, asplit(bc_applied[, targets], 2)) ~ dsRNA, bc_applied)
    

    cbind交叉检查

    lm(cbind(target1, target2)~ dsRNA, data = bc_applied)
    

    -输出

    #Call:
    #lm(formula = cbind(target1, target2) ~ dsRNA, data = bc_applied)
    
    #Coefficients:
    #             target1   target2 
    #(Intercept)   0.45161   0.47457
    #dsRNAgene2    0.36341   0.29226
    #dsRNAgene3   -0.07115  -0.03003
    

    【讨论】:

      猜你喜欢
      • 2017-05-20
      • 2022-01-13
      • 1970-01-01
      • 2015-11-09
      • 2020-09-02
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 2018-11-28
      相关资源
      最近更新 更多