如何解决如何对具有日期的组进行回归
我正在尝试为我的 df 中的每个 weight
和 animal_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'])
斜率计算看起来不错,但截距当然没有意义。
然后我意识到这种方法只有在测量间隔是规则的情况下才有用。在大多数情况下,间隔是 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 举报,一经查实,本站将立刻删除。