【问题标题】:Function to eliminate rows from a dataframe with certain condition in R用于从 R 中具有特定条件的数据帧中消除行的函数
【发布时间】:2021-02-21 04:50:32
【问题描述】:

大家!

我将尝试解释我的问题。这对我来说非常困难。我希望你能帮助我:

我有一个数据框,我们称之为 DF1,它看起来像下一个:

|Symbol |   Date    | Volume |  Price|
|----------------------------|-------|
|A      |2014-01-01 | 0      |    4  |
|A      |2014-01-02 | 7      |    7  |
|A      |2014-01-03 | 8      |    9  |
|A      |2014-01-04 | 1      |    5  |
|B      |2014-01-01 |45      |    6  |
|B      |2014-01-02 |0       |   11  |
|B      |2014-01-03 |34      |    8  |
|B      |2014-01-04 |45      |    5  |
|C      |2014-01-01 |4       |    6  |
|C      |2014-01-02 |0       |    5  |
|C      |2014-01-03 |14      |   25  |
|D      |2014-01-01 |31      |    4  |
|D      |2014-01-02 |7       |    6  |
|D      |2014-01-03 |18      |    3  |
|D      |2014-01-04 |15      |    7  |
|E      |2014-01-01 |13      |    8  |
|E      |2014-01-02 |0       |    9  |

有了这个数据框,我通过以下代码行创建了一个新的数据框,我们称之为 DF2:

RM <- DF1 %>% group_by(Date) %>%
  mutate(weight = Volume/sum(Volume),      
         R_i = weight*(log(Price)-log(lag(Price)))) %>%          
  summarise(RM = sum(R_i, na.rm = TRUE))

从 RM 中,我只选择我感兴趣的日期:

RM_reg <- subset(RM, date >= "2014-03-05" & date<="2014-09-03")

最后,RM_reg 看起来像这样:

|   Date    | RM     |
|2014-03-05 | 0      |
|2014-03-06 | 7      | 
|2014-03-07 | 8      |    
|2014-03-08 | 1      |    
|2014-03-09 | 45     |    
|2014-03-10 | 0      |   
|2014-03-11 | 34     |    
|2014-03-12 | 45     |   
|2014-03-13 | 4      |    
|2014-03-14 | 0      |    
|2014-03-15 | 14     |  
|2014-03-16 | 31     |    

需要注意的是,RM_reg 列中的值不是实际值,而只是示例。从我的原始数据框开始,RM_reg 有 125 行。

然后,从数据框 DF1 中,我通过以下代码提取 Company 列等于 A 的行:

DF_A <- DF_1%>%
  filter(Symbol=="A")

我通过以下代码向数据框 DF_A 添加一列返回:

RA <- DF_A %>% group_by(Symbol)%>%
  mutate(Ret_i = log(Price) - lag(log(Price)))

我消除了第一行,也就是NA:

AR <- na.omit(RA)

从 AR 中,我只选择我感兴趣的日期:

AR_reg <- subset(AR, date >= "2014-03-05" & date<="2014-09-03")

AR_reg 看起来像这样:

|Symbol |   Date    | volume |price | Ret_i  |
|--------------------------------------------|
|A      |2014-03-05 | 1      |   5  |   2    |
|A      |2014-03-06 | 3      |   8  |   3    |
|A      |2014-03-07 | 7      |   4  |   4    |
|A      |2014-03-08 |3       |   6  |   5    |
|A      |2014-03-09 |34      |   7  |   1    |
|A      |2014-03-10 |45      |  34  |   4    |
|A      |2014-03-11 |4       |   5  |   3    |
|A      |2014-03-12 |9       |   7  |   5    |
|A      |2014-03-13 |8       |   6  |   6    |
|A      |2014-03-14 |4       |   4  |   1    |
|A      |2014-03-15 |0       |   7  |   4    |
|A      |2014-03-16 |4       |   7  |   7    |

需要注意的是,AR_reg 列中的值不是实际值,而只是示例。从我的原始数据框开始,AR_reg 也有 125 行。

最后,因为 RM_reg 和 AR_reg 我可以通过以下代码在 RM_reg 的 RM 列上回归 AR_reg 的 Ret_i 列:

mod <- lm(AR_reg$Ret_i ~ RM_reg$RM) 

我需要对数据帧 DF1 中的所有符号执行与上述相同的操作,在本例中为“B”、“C”、“D”、“E”。问题是我们没有相同数量的条目,或者对应于所有符号的相同数量的行,这是能够进行回归的必要条件。要进行回归,我需要对每个符号的回报进行 125 次观察。

我的想法是消除生成的类似于 AR_reg 的数据帧没有 125 个条目或行的符号;但事实是我不知道该怎么做,我认为必须提出一个功能,但这是一个我仍然不主导的主题。

非常感谢您阅读我的内容,希望您能理解我。任何帮助或建议将不胜感激

翻译为www.DeepL.com/Translator(免费版)

【问题讨论】:

  • 您能否在示例df1的情况下也包括所需的输出?

标签: r function dataframe for-loop linear-regression


【解决方案1】:

通过Date 加入DF1RM,仅保留特定日期之间的数据,为每个Symbol 计算Ret_i 并删除NA 值并创建模型列表。

完整的代码如下所示:

library(dplyr)

DF1$Date <- as.Date(DF1$Date)

RM <- DF1 %>% 
  group_by(Date) %>%
  mutate(weight = Volume/sum(Volume),      
         R_i = weight*(log(Price)-log(lag(Price)))) %>%          
  summarise(RM = sum(R_i, na.rm = TRUE))


result <- DF1 %>%
  left_join(RM, by = 'Date') %>%
  filter(between(Date, as.Date("2014-03-05"), as.Date("2014-09-03")))
  group_by(Symbol) %>%
  mutate(Ret_i = log(Price) - lag(log(Price))) %>%
  na.omit() %>%
  summarise(model = list(lm(Ret_i~RM)))

result

【讨论】:

    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2023-02-23
    • 2021-02-19
    • 1970-01-01
    相关资源
    最近更新 更多