使用Brightway2进行蒙特卡罗模拟时会出现负对数正态

时间:2017-08-29 09:43:49

标签: python brightway

我无法弄清楚如何设置BW2以在MC模拟中获得具有对数正态分布的参数的负值,例如模拟负排放。例如:

from brightway2 import *
import numpy as np


mydb = Database('mydb')

mydb.write({
    ('mydb', 'Some activity'): {
        'name': 'Some activity',
        'unit': 'kWh',
        'exchanges': [{
            'input': ('mydb', 'Carbon dioxide'),
            'amount': 20, # positive!
            'unit': 'kg',
            'type': 'biosphere', 
            'uncertainty type' : 2,
            'loc' : np.log(20), 
            'scale' : 1.01 
            }]
    },
    ('mydb', 'Carbon dioxide'): {'name': 'Carbon dioxide', 'unit': 'kg', 'type': 'biosphere'}
    })

exc = list(mydb.get('Some activity').exchanges())[0]
exc.as_dict()
exc.random_sample(n=10)  

这很有效。我明白了:

Out[8]: 
array([ 25.20415107,  17.48476344,  16.98842921,   3.79548038,
    12.54165042,  27.93752377,   7.57070571,  43.22285015,
    48.44984804,  13.83083672]) # everything fine

现在让我们假设我想获得相同的值,但是负数:array([ -25.20415107, -17.48476344, etc. ...,因为我认为我的碳摄取量为-20千克二氧化碳。如果我写'amount': -20,我会得到一个奇怪的结果:

Out[9]: 
array([   0.73060359,   36.69825867,    5.71416558,   10.78119397,
     16.24447705,    2.96507057,    6.73564118,   19.24411117,
      7.23110067,  126.42690714])

我知道对数正态分布不能是负数,但我所期望的是,分布是根据“loc”和“scale”信息计算出的正值,然后根据“金额”信息进行反转。这对于在具有负排放的库存上执行MC是必要的。任何线索?感谢

1 个答案:

答案 0 :(得分:1)

阻止预期行为有两个问题:

  1. 仅在字段amount中给出负值是不够的; RNG代码位于stats_arrays库中,您必须将字段negative设置为Truesee docs)。
  2. brightway2-data中有一个错误,在7e3341c和发布2.4.6中已修复,导致密钥negative无法在exchange.uncertainty中使用。
  3. 通常,从其他格式导入数据时,negative字段会自动设置,例如SimaPro CSVEcospold 1。此外,当数据库处理为参数数组时,negative字段也来自amount field always set。这种情况的不同之处在于您直接从stats_arrays调用函数,而不是通过brightway2-calc

    在最新安装中添加negative字段:

    from brightway2 import *
    import numpy as np
    projects.set_current("SO 45935773")
    bw2setup()
    
    mydb = Database('mydb')
    gwp = ('IPCC 2013', 'climate change', 'GWP 100a')
    co2 = get_activity(('biosphere3', '349b29d1-3e58-4c66-98b9-9d1a076efd2e'))
    
    mydb.write({
        ('mydb', 'Some activity'): {
            'name': 'Some activity',
            'unit': 'kWh',
            'exchanges': [{
                'input': co2.key,
                'amount': -20, # negative
                'negative': True,
                'unit': 'kg',
                'type': 'biosphere', 
                'uncertainty type' : 2,
                'loc' : np.log(20), 
                'scale' : 1.01 
            }]
        }
    })
    
    exc = list(mydb.get('Some activity').exchanges())[0]
    exc.random_sample(n=10)  
    

    产生预期的行为:

    array([ -3.24683872,  -5.01873359, -31.54532003, -40.59523805,
           -54.00447092,  -6.11459063, -41.5250442 ,  -8.05295075,
           -31.46077832, -29.8769442 ])