【问题标题】:Loading first few observations of data set without reading entire data set (Stata 13.1)?加载数据集的前几个观察结果而不读取整个数据集(Stata 13.1)?
【发布时间】:2015-04-28 13:40:40
【问题描述】:

(Stata/MP 13.1)

我正在处理一组需要很长时间才能加载的海量数据集。我目前正在遍历所有数据集以每次加载它们。

是否可以只告诉 Stata 加载每个数据集的前 5 个观察值(或者通常每个使用命令中的第一个 n 数据集)而无需实际加载整个数据集?否则,如果我要加载整个数据集,然后只保留前 5 个观察值,则该过程需要很长时间。

这是我已经尝试过的两种解决方法

  1. use in 1/5 using mydata :我认为这比仅加载数据然后将您想要的观察结果保存在不同的行中更有效,但我认为它仍然会读取整个数据集。
  2. 首先加载所有数据集,然后将所有数据集的副本保存为前5个观测值,然后仅使用副本:这很麻烦,因为我有很多不同的文件;我非常喜欢直接读取前 5 个观察值的方法,而不必求助于这种方法,也不必读取整个数据集。

【问题讨论】:

    标签: stata


    【解决方案1】:

    我会说使用in 是在 Stata 中执行此操作的自然方式,但测试表明 你是对的:考虑到数据集的大小,它确实没有“大”的区别。一个例子是(有 148,000,000 次观察)

    sysuse auto, clear
    expand 2000000
    
    tempfile bigfile
    save "`bigfile'", replace
    
    clear
    timer on 1
    use "`bigfile'"
    timer off 1
    
    clear
    timer on 2
    use "`bigfile'" in 1/5
    timer off 2
    
    timer list
    timer clear
    

    导致

    . timer list
       1:      6.44 /        1 =       6.4400
       2:      4.85 /        1 =       4.8480
    

    我发现这很令人惊讶,因为 in 在其他情况下似乎真的很有效。 我会联系 Stata 技术支持(和/或四处搜索,包括 www.statalist.com)只是问为什么in 并没有快多少 (独立于你找到一些其他策略来处理这个问题)。

    当然值得使用;但对于许多应用程序来说不够快。

    就工作流程而言,您的第二个选项可能是最好的。在创建较小的数据集时让计算机继续运行(使用 for 循环),然后在完成后返回常规编码/调试。这真的取决于你在做什么,所以它可能有效或无效。

    【讨论】:

      【解决方案2】:

      实际上,我找到了解决方案。如果你跑

      use mybigdata if runiform() <= 0.0001
      

      Stata 将随机抽取数据集的 0.0001 个样本,而不读取整个数据集。

      谢谢!

      文森特

      编辑:2015 年 4 月 28 日(美国东部标准时间下午 1:58) 我很抱歉。事实证明,上述内容实际上不是原始问题的解决方案。似乎在我的系统上,使用速度的变化很大

      use mybigdata if runiform() <= 0.0001
      

      每次我运行它。当我发布上述是一个解决方案时,我认为当我运行代码时,它恰好是一个更快的实例。但是,正如我现在反复运行的那样

      use mybigdata if runiform() <= 0.0001
      

      对比

      use in 1/5 using mydata
      

      我真的发现了

      use in 1/5 using mydata
      

      平均速度更快。

      一般来说,我的问题只是如何读取 Stata 数据集的一部分,而不必为了计算目的而读取整个数据集,尤其是当数据集非常大时。

      编辑:2015 年 4 月 28 日(美国东部标准时间下午 2:50) 我总共有 20 个数据集,每个数据集有 5 到 1500 万个观察值。我只需要保留 8 个变量(每个数据集中有 58-65 个变量)。下面是前四个“describe, short”语句的输出。

      2004 action1
      
      Contains data from 2004action1.dta
        obs:    15,039,576                          
       vars:            64                          30 Oct 2014 17:09
      size: 2,827,440,288                          
      Sorted by: 
      
      2004 action2578
      
      Contains data from 2004action2578.dta
        obs:    13,449,087                          
       vars:            59                          30 Oct 2014 17:16
      size: 2,098,057,572                          
      Sorted by:  
      
      2005 action1
      
      Contains data from 2005action1.dta
        obs:    15,638,296                          
       vars:            65                          30 Oct 2014 16:47
      size: 3,143,297,496                          
      Sorted by:  
      
      2005 action2578
      
      Contains data from 2005action2578.dta
        obs:    14,951,428                          
       vars:            59                          30 Oct 2014 17:03
      size: 2,362,325,624                          
      Sorted by:   
      

      谢谢!

      文森特

      【讨论】:

      • 您找到了解决方案是件好事,但坦率地说,我不明白为什么会这样。我相信您的代码行会为每个观察结果计算一个随机数,然后将其与0.0001 进行比较,并相应地合并观察结果。因此,这涉及检查每个观察结果,即整个数据集。事实上,在我的机器上进行的测试表明这需要两倍于indoes 的时间。第二点是你原来的问题没有提到你想要一个随机样本;你可能想编辑它。第三点是你得到可变数量的观察。第四点,使用set seed进行reprod。
      • 嗨罗伯托。谢谢你的帮助。事实上,我刚刚根据您的帖子编辑了我的答案,我意识到我实际上并没有找到解决方案。有关详细信息,请参阅我的编辑;但是,我非常感谢您的提示和建议!
      • 没问题。只是好奇:您的原始数据集有多少观察值和变量?您应该在原始帖子中显示describe, short 的输出。您需要保留所有变量吗?您正在处理多少个文件?
      • 当然,我已经在上面的最新编辑中回答了您的问题。
      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      相关资源
      最近更新 更多