【问题标题】:Making Sense of Time Series Data with > 43,000 observations通过 > 43,000 次观察来理解时间序列数据
【发布时间】:2020-02-04 09:12:49
【问题描述】:

更新帖子

经过大量的工作,我终于合并了三个不同的数据集。结果是一个时间序列数据框,包含 7 个 7 个变量的 43,396 个观测值。下面,我包含了几行我的数据的样子。

     Dyad  year  cyberattack  cybersev MID   MIDsev   peace score
     2360  2005    NA          NA       0      1          0
     2360  2006    NA          NA       NA     NA         0
     2360  2007    1           3.0      0      1          0
     2360  2008    1           4.0      0      1          0
     2360  2009    3           3.33     1      4          0
     2360  2010    1           3.0      NA     NA         0
     2360  2011    3           2.0      NA     NA         0
     2360  2012    1           2.0      NA     NA         0 
     2360  2013    4           2.0      NA     NA         0

如果我有兴趣比较不同国家对 (dyads) 在发动攻击的频率方面有何不同(在网络空间中,在物理上使用 MID,或者两者都没有)...我应该怎么做?

由于我使用的是国家/年数据,如何在我的 Dyad 变量中获取不同国家 (Dyads) 的描述性统计数据?例如,我想知道 Dyad 2360(美国和伊朗)的行为与其他国家相比如何。

我尝试了这段代码,但它只是给了我一个我独特的 dyad 对的列表:

    table(final$Dyadpair) 
    names(sort(-table(final$Dyadpair)))

您提到使用 aggregatedplyr - 但我不明白这些将如何让我为我所有独特的 dyads 进行描述性统计?您介意详细说明一下吗?

代码是否有可能返回如下内容:对于 2005-2013 年间的 Dyad 2360,80% 是 NA,10% 是网络攻击,10% 是 MID 攻击,等等?


更新澄清:

好的,是的 - 上面的例子只是假设性的。基于我提供的九行数据 - 这是我希望 R 在描述性统计方面能够提供的内容。

二元:2360 无攻击:22.22% (2/9) ….2005 年和 2006 年

网络攻击:77.78% (7/9) ….2007-2013 年

MID 攻击:11.11% (1/9) ….in 2009

网络和 MID:11.11% (1/9) ….in 2009

基本上,在给定的时间范围内(我上面给出的示例为 2005-2013 年),其中有多少年没有发生攻击,有多少年导致网络攻击,有多少年导致MID 攻击,以及其中有多少年导致网络和 MID 攻击。

我不知道这是否可能与我的数据设置方式有关 —> 因为我每年汇总网络攻击和 MID 攻击?是的,我还想考虑攻击的严重性(网络攻击和 MID 攻击),但我不知道该怎么做。

这是否有助于澄清我在寻找什么?

【问题讨论】:

  • merge 时,可以设置参数all = TRUE 保留所有记录。对于其余部分,“如何理解我的数据,以便在论文和演示文稿中出现”过于宽泛。 Stack Overflow 是针对特定的、可回答的编程问题——这是一个关于数据分析和通信的一般性、开放式问题。
  • 一些一般性建议 - 您已经发现了一些弱点,例如 NA 的使用不一致、不同的评分量表等。这些是否会导致问题以及导致问题的程度取决于您如何分析它们,但是一致性很好,通常会使事情变得更好。我建议 (a) 始终使用 NA 来表示缺失值,而不是 0,(b) 使用一致的尺度——1 对我来说是一种非严重攻击,0 是没有攻击,并且NA 作为“我们不知道”。将数据转换为 (a) 和 (b) 可能是一个好主意。并在汇总并取平均值之前这样做。
  • 关于获取独特二元组的描述性统计数据,您已经在使用的基础 R aggregate 是一个很好的工具。您必须通过“他们发起网络攻击的时间百分比”来准确定义您的意思 - 也许您的意思是 所有攻击中网络攻击的百分比,或者您的意思是 包含网络攻击的攻击年份百分比,或者您的意思可能是别的。虽然 aggregate 在基础 R 中很好,但您可能会发现 dplyr 更强大,here's a nice introduction
  • 你好,@Gregor。感谢您的反馈意见。我用更具体的问题更新了我的帖子。
  • @Gregor 另外,将“all = TRUE”添加到我的合并代码中,工作正常。谢谢你。如果你能看看我更新的帖子,我将不胜感激。

标签: r time-series


【解决方案1】:

这是一个dplyr 方法,我对你想要什么做出了最好的猜测。它将输出一个数据框,每个 dyad 一行,每个 dyad 的汇总统计信息相同。

library(dplyr)
your_data %>%
  group_by(Dyad) %>%
  summarize(
    year_range = paste(min(year), max(year), sep = "-"),
    no_attacks = mean(is.na(cyberattack) & (is.na(MID) | MID == 0)),
    cyber_attacks = mean(!is.na(cyberattack)),
    MID_attacks = mean(!is.na(MID) & MID > 0),
    cyber_and_MID = mean(!is.na(cyberattack) & (!is.na(MID) & MID > 0)),
    cyber_sev_weighted = weighted.mean(cyberattack, w = cybersev, na.rm = TRUE)
  )

# # A tibble: 1 x 7
#    Dyad year_range no_attacks cyber_attacks MID_attacks cyber_and_MID cyber_sev_weighted
#   <int> <chr>           <dbl>         <dbl>       <dbl>         <dbl>              <dbl>
# 1  2360 2005-2013       0.222         0.778       0.111         0.111               1.86

使用这些数据:

your_data = read.table(text = 'Dyad  year  cyberattack  cybersev MID   MIDsev   peace_score
     2360  2005    NA          NA       0      1          0
     2360  2006    NA          NA       NA     NA         0
     2360  2007    1           3.0      0      1          0
     2360  2008    1           4.0      0      1          0
     2360  2009    3           3.33     1      4          0
     2360  2010    1           3.0      NA     NA         0
     2360  2011    3           2.0      NA     NA         0
     2360  2012    1           2.0      NA     NA         0 
     2360  2013    4           2.0      NA     NA         0', header = T)

【讨论】:

  • 谢谢。这很有意义。唯一让我感到困惑的是加权网络严重性变量?在我的数据中,“cybersev”(网络攻击严重性)和“MIDsev”(MID 攻击严重性)表示给定年份的平均攻击严重性。所以,如果我试图像对两个攻击变量所做的那样折叠一个年龄范围,我不太确定如何表示这一点。我尝试将此代码:cyber_severity = mean(!is.na(cybersev)), MID_severity = mean(!is.na(MIDsev)), 添加到您提供的代码中,但返回的数字实际上没有意义?
  • 拆开来理解。当 cybersev 为 NA 时,is.na(cybersev) 为 TRUE (1),否则为 FALSE (0)。 ! 正好相反。 mean 取这些数字的平均值,所以mean(!is.na(cybersev)) 就像cyber_attacks = mean(!is.na(cyberattack)),它将为您提供cyberattack 具有非缺失值的行(年)的比例。可能更有用的是mean(cybersev, na.rm = TRUE),它将平均cybersev 值,忽略(删除)NA。
  • 是的。那行得通。谢谢你。我对 MID 严重性遵循了相同的逻辑,这也有效。唯一不理想的是,当我运行此代码时:year_range = paste(min(1992), max(2016), sep = "-")——因为这些是我的三个合并数据集涵盖的总年数……这导致描述性统计数据框将每个 dyad 标记为“1992- 2016 年”,由于缺失 (NAs),每个特定对子所涵盖的年份往往不是那么大。有没有一种方法可以让 R 自动检测 Dyad 所涵盖的年份?
  • 例如,一个二元组可能只在 1998-2007 年期间相互交互。但根据数据框,攻击似乎发生在 1992-2016 年期间。这个问题有意义吗?
  • 当然,过滤您的数据框,使那些无用的行不存在。也许您想过滤掉所有度量列都是0NA 的行。创建一个小帮助函数来测试某些东西是否不是 NA 或 0 - present = function(x) !is.na(x) &amp; x &gt; 0,然后 your_data %&gt;% filter(present(cyberatttack) | present(cybersev) | present(MID) | present(MIDsev)) 以保留至少其中一列具有非缺失值且大于 0 值的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多