【问题标题】:POSIXct in a regression as continuous variable?POSIXct 在回归中作为连续变量?
【发布时间】:2014-01-18 20:30:50
【问题描述】:

我正在尝试将回归与一天中的时间作为连续预测变量以及二元 TRUE/FALSE 结果进行拟合。

我的时间变量如下所示:

> class(sched_SMS_time)
[1] "POSIXct" "POSIXt" 
> head(sched_SMS_time)
[1] NA    "2014-01-01 11:15:00 EST" "2014-01-01 11:30:00 EST" 

我的问题是,R 一直以分类的方式对待它(即作为一个因素),并抛弃我的回归模型。

我能想到的唯一方法(并且已经找到 elsewhere on the stack exchange site)似乎是将 POSIXct 对象转换为十进制数字对应物,即

as.numeric(str_sub(gsub(":", ".", bob_os_ten$sched_SMS),1,-4))
head(sched_SMS_time_conv)
[1]    NA 11.15 11.30 11.45 12.15 13.00

将其重新插入我希望运行的模型中,这似乎会给出合理的结果...

但是,我意识到这会丢失更细粒度的信息。 (即,无法区分周一的 9 点和周二的 9 点)。

因此我的问题是:

1) 有没有一种方法可以让 POSIXct 对象在连续意义上直接用于回归(基本的东西,在 lme4 中用于多级数据)

2) 如果答案为“否”,上述解决方法是最佳替代方案吗?

【问题讨论】:

    标签: r object time posixct


    【解决方案1】:

    其实可以直接使用一个POSIXct次的向量(假设它叫tt),它会被当作as.numeric(tt)来处理,即当作从1970-01-01开始的秒数格林威治标准时间 00:00:00。这是一个例子:

    # set up inputs
    set.seed(123)
    n <- 100 # must be even as n/2 is used below
    y <- rbinom(n, 1, .5) == 1
    tt <- seq(as.POSIXct("2004-01-01"), length = n, by = "day")
    
    # run a glm regression
    glm(y ~ tt, family = binomial)
    
    # and an lme4 example
    library(lme4)
    g <- gl(2, n/2)
    glmer(y ~ tt + (1 | g), family = binomial)
    

    添加:新答案。 正如@jlhoward 所指出的,将线性回归更改为逻辑回归。 添加 lme4 示例。

    【讨论】:

      【解决方案2】:

      将您的时间转换为自某个特定基准时间以来的连续时间变量(例如,自 1970 年 1 月 1 日开始的秒数,也称为自纪元以来的秒数)可能是有意义的。

      这很容易通过unclass 函数使用POSIXct 完成:

      str(Sys.time())
      #   POSIXct[1:1], format: "2013-12-31 22:59:18"
      
      unclass(Sys.time())
      # [1] 1388548783
      

      因此,在您的示例中,您将在回归模型中将 sched_SMS_time 替换为 unclass(sched_SMS_time)

      【讨论】:

        【解决方案3】:

        这只是建立在@G.Grothendieck 的响应之上,注意到您的响应变量是二进制 (T/F)。

        如果您的响应是 y(T/F 向量),并且您的预测器 sched_SMS_time 是 POSIXct,则创建一个数据框 df 为:

        # not tested...
        df <- data.frame(y=y, time=sched_SMS_time, t=sched_SMS_time-sched_SMS_time[1])
        fit <- glm(y~t, data=df,family=binomial())
        df$pred <- predict(fit,type="response")
        
        library(ggplot2)
        ggplot(df, aes(x=time)) + geom_point(aes(y=y)) + geom_line(aes(y=pred))
        

        请注意,这适合使用t,但绘图使用time .

        【讨论】:

          猜你喜欢
          • 2020-01-08
          • 2016-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-23
          • 1970-01-01
          • 2019-07-30
          • 2019-09-03
          相关资源
          最近更新 更多