微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何对具有日期的组进行回归

如何解决如何对具有日期的组进行回归

我正在尝试为我的 df 中的每个 weightanimal_id 计算 cycle_nr 的回归系数:

animal_id cycle_nr Feed_date 重量
1003 8 2020-02-06 221
1003 8 2020-02-10 226
1003 8 2020-02-14 230
1004 1 2020-02-20 231
1004 1 2020-02-21 243

我尝试使用此来源 source

import pandas as pd
import statsmodels.api as sm 


def GroupRegress(data,yvar,xvars):
    Y = data[yvar]
    X = data[xvars]
    X['intercept'] = 1.
    result = sm.OLS(Y,X).fit()
    return result.params

result = df.groupby(['animal_id','cycle_nr']).apply(GroupRegress,'Feed_date',['weight'])

代码失败,因为我的变量包含日期。

我接下来尝试了什么:

我想我可以创建一个数字列来代替我的日期列。我创建了一个简单的 count_id 列:

animal_id cycle_nr Feed_date 重量 id
1003 8 2020-02-06 221 1
1003 8 2020-02-10 226 2
1003 8 2020-02-14 230 3
1004 1 2020-02-20 231 4
1004 1 2020-02-21 243 5

然后我在这个专栏上运行了我的回归

result = df.groupby(['animal_id','id',['weight'])

enter image description here

斜率计算看起来不错,但截距当然没有意义。

然后我意识到这种方法只有在测量间隔是规则的情况下才有用。在大多数情况下,间隔是 7 天,但有时是 10、14 或 21 天。

删除了间隔不是 7 天的记录并重新运行了我的回归......它有效,但我讨厌我必须扔掉完美的数据。

我想知道是否有更好的方法可以将日期包含在回归中,或者可以校正日期的不同间隔。有什么建议吗?

解决方法

我想知道是否有更好的方法可以将日期包含在回归中,或者可以校正日期的不同间隔。

  • 如果提要日期是字符串,则使用 pandas.to_datetime 创建日期时间系列。
  • 使用该新系列计算两次喂食之间的实际时间差
  • 在回归中使用结果 timedeltas 而不是 linear 虚构 序列。时间增量具有不同的属性(即微秒、天),可根据您需要的分辨率使用这些属性。

我的第一直觉是分别为每个组生成 Timedeltas。每组的第一次喂食当然是零时间。

甚至可能不需要制作 Timedeltas - 在 Numpy 或 Scipy 甚至 Pandas 中可能有日期时间感知回归方法 - 我想应该有,它是一个足够常见的应用程序。

日期时间序列可以转换为用于回归的有序值,而不是 Timedeltas。

df = pd.DataFrame(
    {
        "feed_date": [
            "2020-02-06","2020-02-10","2020-02-14","2020-02-20","2020-02-21",]
    }
)


>>> q = pd.to_datetime(df.feed_date)
>>> q
0   2020-02-06
1   2020-02-10
2   2020-02-14
3   2020-02-20
4   2020-02-21
Name: feed_date,dtype: datetime64[ns]
>>> q.apply(pd.Timestamp.toordinal)
0    737461
1    737465
2    737469
3    737475
4    737476
Name: feed_date,dtype: int64
>>>   

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。