【问题标题】:Dynamic Regression Models in data.table -data.table 中的动态回归模型 -
【发布时间】:2019-08-22 21:01:04
【问题描述】:

我从Formula with dynamic number of variables 知道,我可以使用 as.formula 进行动态回归,或者使用 paste 在公式中包含大量变量

#This Works:
glm(as.formula(paste0("vs~am")) , mtcars , family = binomial)

我正在尝试使用 data.table,因为我正在使用大型 data.set。我从Using data.table to create a column of regression coefficients 知道,我可以在 i 参数中运行回归模型

#So Does This:
m <- data.table( mtcars )
m[ , glm(vs~am, family = binomial) ]

我似乎无法弄清楚如何在 data.table 中使用 as.formula。我正在尝试将很多列作为自变量。

#This breaks
m[ , glm(as.formula(paste0("vs~am")), family = binomial) ]

【问题讨论】:

  • 也许:m[ , glm(eval(parse(text="vs~am")), family = binomial)]m[ , glm(eval(substitute(as.formula("vs~am"))), family = binomial)]m[ , glm(eval(expression(as.formula("vs~am"))), family = binomial)]m[ , glm(eval(quote(as.formula("vs~am"))), family = binomial)] 另请参阅 stackoverflow.com/questions/24833247/…

标签: r data.table


【解决方案1】:

不完全确定如何从data.table 中“捕获”数据。但是,也许我们可以将我们的公式应用于data.table。诚然,这不是最好的解决方案:

myformula<-function(x,y,df,...){
  f1<-as.formula(paste0(x,"~",y))
  #to_remove<-setdiff(names(df),y)#This was to be used if I used this with .SD
  do_this<-do.call("glm",list(f1,quote(df),family="binomial",...))
  do_this
}
myformula("am","vs",m)

【讨论】:

    【解决方案2】:

    我不确定您是否只是想要一列,其中系数一直向下重复,或者每行数据的单独预测,或其他东西,但看起来您只需要指定数据的位置来自:

    m$amcoef <- m[ , glm(as.formula(paste("vs~am")), family = binomial, data=m)$coefficients["am"] ]
    

    对于一直向下重复的系数,返回

        mpg cyl disp  hp drat    wt  qsec vs am gear carb    amcoef
     1: 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 0.6931472
     2: 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 0.6931472
     3: 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 0.6931472
     4: 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 0.6931472
     5: 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 0.6931472
     6: 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 0.6931472
    

    m$ampred <- m[ , predict(glm(as.formula(paste("vs~am")), family = binomial, data=m),  newdata=m) ]
    

    在完整数据集上运行模型,然后将其应用于每一行数据(“-0.5390+0.6931”表示 am=1,“-0.5390”表示 am=0),返回:

        mpg cyl disp  hp drat    wt  qsec vs am gear carb     ampred
     1: 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4  0.1541507
     2: 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4  0.1541507
     3: 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1  0.1541507
     4: 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 -0.5389965
     5: 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 -0.5389965
     6: 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 -0.5389965
    

    这样做的缺点是它将重新运行适合每行数据的初始模型。我会在数据表之外运行您感兴趣的每个 glm(一次),然后调用 glm 对象来获取特定于行的值:

    mod1 <- glm(as.formula(paste("vs~am")), family = binomial, data=m)
    m$ampred1 <- m[ , predict(mod1, newdata=m) ]
    

    不确定这是否会妨碍您正在寻找的动态。

    【讨论】:

      【解决方案3】:

      dat.table内,data可以指定为.SD

      library(data.table)
      out2 <- m[ , glm(as.formula(paste0("vs", "~am")), family = binomial, data = .SD) ]
      

      另外,可以使用reformulate 代替paste

      m[, glm(reformulate("am", "vs"), family = binomial, data = .SD)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-23
        • 1970-01-01
        • 1970-01-01
        • 2018-08-22
        • 1970-01-01
        • 1970-01-01
        • 2019-10-09
        • 2020-04-30
        相关资源
        最近更新 更多