用R预测我的体重

6月23日,2018年

(本文首次发表于 计量经济学和自由软件,并对 188bet appR博主

近两年来,我几乎每天都在测量体重;我其实是早点开始的,但是
不一致。这篇博文的目标是重新熟悉时间序列;我还没有
had the opportunity to work with time series for a long time now and I have seen that quite a few
处理时间序列的包已经在cran上发布。在这篇博文中,我会探索
我的体重测量使用了{ TsiBLAS}{TiBultTime}包装,,
然后用{预测}包裹。

First,让我们加载所需的包,读取数据并将其转换为tsibble

库(“tidyverse“的图书馆(“雷德尔图书馆(“预测“图书馆(““我说了算”图书馆(“藏书时间”图书馆(““老鼠”(见表1)
weight <- read_csv("https://gist.githubusercontent.com/b-rodrigues/ea60679135f8dbed448cc66a16811f/raw/18b46f3b07207f76ce5ee2715d0f9574b615f170/gistfile1.txt“)%>%作为“tsibble”()
用列规范解析:cols(date=col_date(format=”“)poids=col_double())
索引是“日期”。

你可以阅读更多关于金宝搏网址{ TsiBLAS} 在这里.Here,我使用{ TsiBLAS}主要地
下一步,哪个正在使用函数FILILNA()在土拨鼠上。FILILNA()转动
隐式将缺少的值转换为显式缺少的值。这些是隐式缺失值:

日期:2013-01-01 84.102 2013-01-04 85.60

这是同样的观点,但有明显的缺失值:

日期:2013-01-01 84.102 2013-01-02 NA3 2013-01-03 NA4 2013-01-04 85.60

This is useful to do,because I want to impute the missing values using the老鼠包裹。
让我们这样做:

weight <- weight %>%     fill_na()imp_weight <- mice(data = weight) %>%     mice::complete("“长”(见表1)
## ##  iter imp variable##   1   1  Poids##   1   2  Poids##   1   3  Poids##   1   4  Poids##   1   5  Poids##   2   1  Poids##   2   2  Poids##   2   3  Poids##   2   4  Poids##   2   5  Poids##   3   1  Poids##   3   2  Poids##   3   3  Poids##   3   4  Poids##   3   5  Poids##   4   1  Poids##   4   2  Poids##   4   3  Poids##   4   4  Poids##4个5点5个1点5个2点5个3点5个4点5个5个5点

让我们看看imp_weight

头部(重量)
35\35\35\35\35\35\\35\35\35\35\\\35\\\\\\\\\\\\\\\\\\\\\35\\\\\\\\35\\\\35\\\\\\\\\\\\\一个

让我们选择相关数据。我从2016年7月11日开始过滤,那是我开始的地方
几乎每天都在称重,至2018年5月31日。I want to predict my weight for the
6月(您可以将2018年6月作为测试数据,剩下的作为训练
数据):

imp_weight_train <- imp_weight %>%     filter(Date >="2016年7月11日”,日期<2018年5月31日(见表1)

在下一行,我创建了一个名为归责和柱子一样
.imp但在品格上,remove unneeded columns and rename some other columns ("Poids“是
French for weight):

imp-weight_train<-imp-weight_train%>%突变(插补=as.character(.imp))%>%选择(-.id,-.imp)%>%重命名(日期=日期)%>%重命名(权重=POID)

让我们看看数据:

ggplot(弹头重量训练,AES(日期,重量,colour = imputation)) +    geom_line() +     theme(legend.position ="“底部”(见表1)

这些情节提供了一些信息,但最好是把线弄平。这是可能的
计算滚动平均值。For this I will use theROLIFY()function of the{TiBultTime}包裹:

平均滚动5<-滚动(平均,window = 5)mean_roll_10 <- rollify(mean,窗口=10)

ROLIFY()可以看作副词,很像purrr::safely();;ROLIFY()是更高的
逐字滚动函数的顺序函数,在这种情况下平均值()也就是说
rollifying the mean creates a function that returns the rolling mean.这个窗口参数允许
you decide how smooth you want the curve to be: the higher the smoother.然而,你会输的
一些观察结果。让我们使用此函数将滚动方式添加到数据帧:

imp_weight_train<-imp_weight_train%>%group_by(插补)%>%mutate(roll_5=mean_roll_5(重量),Roll_10=平均_Roll_10(重量)

Now,让我们绘制这些新曲线:

ggplot(弹头重量训练,AES(日期,roll_5,colour = imputation)) +    geom_line() +     theme(legend.position ="“底部”(见表1)
## Warning: Removed 20 rows containing missing values (geom_path).

ggplot(弹头重量训练,AES(日期,Relay10,colour = imputation)) +    geom_line() +     theme(legend.position ="“底部”(见表1)
警告:删除了包含丢失值的45行(geom_路径)。

That's easier to read,不是吗??

Now,我将使用auto.arima()函数在数据上训练模型以预测我的体重
六月。然而,我的数据,,imp_weight_train是数据集列表。auto.arima()
不将数据帧作为参数,更不用说数据集列表了。I'll create a wrapper around
auto.arima()在数据集上工作的,然后将其映射到数据集列表:

auto.arima.df<-函数(数据,Y…)y<-enquo(y)yts<-data%>%pull(!!y) %>%         as.ts()    auto.arima(yts,……)}

Auto.ARIMAtakes a data frame as argument,and thenY,which is the column that contains the
单变量时间序列。然后将此列从数据帧中拉出,转换为时间
series object withas(),and then passed down toauto.arima().I can now use this function
在我的数据集列表中。The first step is to nest the data:

嵌套的_数据<-imp_weight_train%>%group_by(插补)%>%nest()

让我们看看Neestdd-数据

Neestdd-数据
## # A tibble: 5 x 2##   imputation data              ##
              
         
          (1)1
          
           (2)2
           
            ## 3 3
            
             (4)4
             
              ## 5 5
              
             
            
           
          
         
        

Neestdd-数据是一个带有名为data,这就是所谓的列表列。各
元素data本身就是一个藏书。这是一个有用的结构,因为现在我可以绘制地图了Auto.ARIMA
到数据帧:

models <- nested_data %>%     mutate(model = map(data,Autim.Df,y=重量)

第一次看到这个技巧可能有点难。其思路如下:
Neestdd-数据是台伯。因此,我可以使用变异().到现在为止,一直都还不错。
现在我是里面突变的声音,I can usePURR::映射().为什么??PURR::映射()列出一个列表
然后是一个函数作为参数。Remember thatdata是列表列;你可以在上面看到,,
the type of the columndata是列表。所以data是一个列表,因此可以在内部使用PURR::映射().
伟大的。Now,what is insidedata?藏书,其中每个都有一列
打电话重量.This is the column that contains my univariate time series I want to model.让我们
看一看模型

模型
## # A tibble: 5 x 3##   imputation data               model      ##
              
                      
          
           (1)1
            
            
             (2)2
              
              
               ## 3 3
                
                
                 (4)4
                  
                  
                   ## 5 5
                    
                    
                   
                  
                 
                
               
              
             
            
           
          
         
        

模型是一个带有名为model,其中每个元素都是类型的模型阿里玛.

Adding forecasts is based on the same trick as above,我们使用预测()功能:

预测<-模型%>%突变(预测=地图(模型,预测,h = 24)) %>%     mutate(predictions = map(predictions,以“?”表示)%>%拉动(预测)

I forecast 24 days (I am writing this on the 24th of June),把预测转换成藏文,,
然后只提取预测:

forecasts
,[1]]一个表格:24 x 5
           
            
             
              
            
             \35\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\.5 72.4 70.0 72.9 7 71.470.5 72.4 69.9 72.9 8 71.4 70.4 72.4 69.9 72.9 9 71.4 70.4 72.4 69.9 72.9 10 71.4 70.4 72.4 69.8 73.0…还有14行[2]表格:24 x 5点预测``lo 80``hi 80``lo 95``hi 95`*
              
               
                
                 
                 
                  \35\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\.5 72.5 70.0 73.0 7 71.570.5 72.5 69.9 73.0 8 71.5 70.4 72.5 69.9 73.1 9 71.5 70.4 72.5 69.8 73.1 10 71.4 70.3 72.6 69.7 73.1…还有14行[3]表格:24 x 5点预测``lo 80``hi 80``lo 95``hi 95`*
                   
                    
                     
                      
                      
                       ## 1 71.6 70.8 72.4 70.4 72.8## 2 71.5 70.7 72.4 70.2 72.8## 3 71.5 70.6 72.4 70.2 72.9## 4 71.5 70.6 72.4 70.1 72.9## 5 71.5 70.5 72.4 70.0 72.9## 6 71.5 70.5 72.4 70.0 73.0## 7 71.5 70.5 72.5 69.9 73.0## 8 71.4 70.4 72.5 69.9 73.0## 9 71.4 70.4 72.5 69.8 73.0## 10 71.4 70.4 72.5 69.8 73.1## # ...还有14行[4]表格:24 x 5点预测``lo 80``hi 80``lo 95``hi 95`*
                        
                         
                          
                           
                           
                            ## 1 71.5 70.8 72.3 70.3 72.8## 2 71.5 70.7 72.4 70.3 72.8## 3 71.5 70.7 72.4 70.2 72.8## 4 71.5 70.6 72.4 70.1 72.9## 5 71.5 70.6 72.4 70.1 72.9## 6 71.5 70.5 72.5 70.0 73.0## 7 71.5 70.5 72.5 69.9 73.0## 8 71.5 70.4 72.5 69.9 73.0## 9 71.4 70.4 72.5 69.8 73.1## 10 71.4 70.3 72.5 69.8 73.1## # ...还有14行[5]
                             
                              
                               
                                
                                
                                 ## 1 71.5 70.8 72.3 70.3 72.8## 2 71.5 70.7 72.4 70.3 72.8## 3 71.5 70.7 72.4 70.2 72.8## 4 71.5 70.6 72.4 70.1 72.9## 5 71.5 70.6 72.4 70.1 72.9## 6 71.5 70.5 72.4 70.0 73.0## 7 71.5 70.5 72.5 69.9 73.0## 8 71.5 70.4 72.5 69.9 73.0## 9 71.4 70.4 72.5 69.8 73.1## 10 71.4 70.3 72.5 69.8 73.1## # ...还有14行
                                
                               
                              
                             
                            
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
        

所以forecasts是一个隐藏列表,每个包含一个预测。记住我有5个字母,因为
我把数据输入了5次。I will merge this list of data sets together into one,但在我需要之前
要添加索引预测的列,请执行以下操作:

预测<-map2(.x=预测,.y = as.character(seq(1,5)),~mutate(.x,id = .y)) %>%     bind_rows() %>%     select(-c(`Lo 80`,'hi 80`)colname(预测)<-c(““点预测”,“低“95”,““HI95”,““ID”(见表1)

Let's take a look again atforecasts

forecasts
藏文:120 x 4点预测低高ID
          
          
           
           
            \35\\\35; \\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\35; \\\\\\\\\\\\\\\\\.9 1 8 71.4 69.9 72.9 1 9 71.4 69.9 72.9 110 71.4 69.8 73.0 1…还有110行
           
          
         
        

我现在选择六月的真值。I also imputed this data,但我会在这里
只需保持插补的平均值:

weight_june<-imp_weight%>%filter(日期>=”2018-06-01)%>%选择(-.id)%>%分组依据(日期)%>%摘要(真权重=平均值(POID))%>%重命名(日期=日期)

让我们看看六月六日

六月六日
藏语:24 x 2日期真实重量
                   
         
          ##  1 2018-06-01        71.8##  2 2018-06-02        70.8##  3 2018-06-03        71.2##  4 2018-06-04        71.4##  5 2018-06-05        70.9##  6 2018-06-06        70.8##  7 2018-06-07        70.5##  8 2018-06-08        70.1##  9 2018-06-09        70.3## 10 2018-06-10        71.0## # ...还有14行
         
        

让我们重复一遍六月六日5 times,并添加索引1到5。为什么?因为我想合并
预测的真实数据,and having the data in this form makes things easier:

weight_june <- modify(list_along(1:5),~`-(.)权重_june))%>%map2(.y=as.character(seq(1,5)),~mutate(.x,id=.y))%>%bind_rows()。

第一行:

修改(按1:5列出)~`-(.)6月6日)

看起来相当复杂,但你会发现事实并非如此,一旦我们分开。修改()
修改列表。要修改的列表是Liston(1:5),which create a list of无效的S:

Liston(1:5)
\35\\\35\35\\35\\\35\\\35\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[5]空

第二个论点修改()是函数或公式。我创造了以下
formula:

~`-(.)重量(六月)

We all know the function<-(),但不习惯这样看。But consider the following:

A<3
'-'(a)3)

这两种配方是等效的。所以这些行填充了无效的S
使用数据帧六月六日.然后我加上id列,然后将行绑定在一起:绑定\u行().

让我们把六月六日forecasts看看它:

forecasts <- bind_cols(weight_june,预测)%>%选择(-id1)预测
藏文:120 x 6日期真重量ID点预测低高
                   
          
                    
             
             
             
              \35\\\35;\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 6 2018-06-06 70.8 171.5 70.0 72.9 7 2018-06-07 70.5 1 71.4 69.9 72.9 8 2018-06-08 70.1 1 71.4 69.9 72.9 9 2018-06-09 70.3 1 71.4 69.9 72.9 10 2018-06-10 71.0 1 71.4 69.8 73.0…还有110行
             
            
           
          
         
        

Now,对于最后一个绘图:

ggplot(forecasts,AES(X=DATE)colour = id)) +    geom_line(aes(y = true_weight),尺寸=2)+几何线条(aes(y=hi_95))+几何线条(aes(y=low_95))+主题(legend.position=”“底部”(见表1)

The true data fall within all the confidence intervals,但是我有点惊讶于这些间隔,,
尤其是上置信区间;they all are way above 72kg,但是我的真实体重
几个月来,体重一直在71公斤左右波动。我想我得重新振作起来
在时间序列上,because I am certainly missing something!!

If you found this blog post useful,你可能想跟着我twitter
用于博客文章更新。

To 发表评论作者,请关注他们博客上的链接和评论: 计量经济学和自由软件.

188bet appR博客提供 每日电子邮件更新金宝搏网址 Rnews and 教程关于以下主题: 数据科学,, 大数据,, r作业,可视化(可视化) ggplot2型,, 箱形图,, 地图,, 动画)程序设计(程序) 演播室,, 斯维夫,, 乳胶,, SQL,, 日食,, 吉特,, 哈多普,, Web Scraping)统计 regression,, 主成分分析,, 时间序列,, trading还有更多…



如果你走这么远,为什么不 订阅更新 从网站上?Choose your flavor: 电子邮件,, twitter,, 1188bet app,或 脸谱网……

注释已关闭。

Search 188bet appR-bloggers


赞助商

千万不要错过更新!!
订阅R-Bloggers188bet app接收
最新R帖子的电子邮件。
(您将不再看到此消息。)

单击此处关闭(此弹出窗口将不再出现)