2017-06-16 22 views
1

我想用线性模型来拟合季节性假人的电价。所以“DK.days”包含每年10年的日子。如何创建一个季节性假人

head(DK.days) 
[1] "2007-01-01" "2007-01-02" "2007-01-03" "2007-01-04" "2007-01-05" "2007-01-06" 

这是代码的其余部分。

month <- as.numeric(format(DK.days, "%m")) 
MD <- t(sapply(month, "==", c(1:12,0)))+0 
MD <- MD[,-13] 
dimnames(MD) <- list(NULL, c("Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Noe", "Dec")) 
> head(MD) 
     Jan Feb Mar Apr May June July Aug Sep Oct Noe Dec 
[1,] 1 0 0 0 0 0 0 0 0 0 0 0 
[2,] 1 0 0 0 0 0 0 0 0 0 0 0 

因此,我创建了一个每月假人,我想将矩阵转换为季节性矩阵。这就是季节应该如何定义:

month.list <- list(c(3,4,5), c(6,7,8), c(9,10,11), c(12,1,2)) 

我想到合并的月份的列,但我一直在努力到目前为止。如果有人能提供帮助,我会非常感激。

+0

请仔细阅读[如何使R中一个伟大的可重复的例子?(https://开头计算器.com/questions/5963269/how-to-make-a-great-r-reproducible-example)所以我可以在你的数据上测试解决方案; – Masoud

回答

1

您可以使用zoo包:

library(zoo) 
yq <- as.yearqtr(as.yearmon(DK.days) + 1/12) #+1/12 to shift one month 
DK.seasons <- factor(format(yq, "%q"), levels = 1:4, 
        labels = c("winter", "spring", "summer", "fall")) 

例子:

#make an example data-set 
DK.days <- c("2016-01-01","2016-02-29","2016-03-02","2016-04-03", 
       "2016-05-04","2016-06-05","2016-07-06","2016-08-10", 
       "2016-09-06","2016-10-06","2016-11-06","2016-12-06") 
library(anytime) 
DK.Days <- anytime(DK.days) 

library(zoo) 
yq <- as.yearqtr(as.yearmon(DK.days) + 1/12) #+1/12 to shift one month 
DK.seasons <- factor(format(yq, "%q"), levels = 1:4, 
       labels = c("winter", "spring", "summer", "fall")) 

DK.final <- data.frame(cbind(DK.days, data.frame(DK.seasons))) 

这将是输出:

> DK.final 

#  DK.days DK.seasons 
# 1 2016-01-01  winter 
# 2 2016-02-29  winter 
# 3 2016-03-02  spring 
# 4 2016-04-03  spring 
# 5 2016-05-04  spring 
# 6 2016-06-05  summer 
# 7 2016-07-06  summer 
# 8 2016-08-10  summer 
# 9 2016-09-06  fall 
# 10 2016-10-06  fall 
# 11 2016-11-06  fall 
# 12 2016-12-06  winter 

让虚拟变量:

如果你想作为每个季节虚拟变量列然后使用mlr包:

library(mlr) 
DK.final <- cbind(DK.final,createDummyFeatures(DK.final[,2], cols = "var")) 

这会给你:

> DK.final 

#  DK.days DK.seasons winter spring summer fall 
# 1 2016-01-01  winter  1  0  0 0 
# 2 2016-02-29  winter  1  0  0 0 
# 3 2016-03-02  spring  0  1  0 0 
# 4 2016-04-03  spring  0  1  0 0 
# 5 2016-05-04  spring  0  1  0 0 
# 6 2016-06-05  summer  0  0  1 0 
# 7 2016-07-06  summer  0  0  1 0 
# 8 2016-08-10  summer  0  0  1 0 
# 9 2016-09-06  fall  0  0  0 1 
# 10 2016-10-06  fall  0  0  0 1 
# 11 2016-11-06  fall  0  0  0 1 
# 12 2016-12-06  winter  1  0  0 0 
+0

嘿,谢谢你的回答,但我需要一个四列的矩阵 - 每个季节一个。矩阵应该包括1和0 - 如果日期属于季节 - 例如在“01-01-2007”行中,我需要在第一列中列出一个(“冬季”),而其他三列中则为零。如果您需要有关数据集的其他信息,请告诉我应该提供什么。 –

+0

@hoppe_pr检查更新。 – Masoud