Monte Carlo 模拟 Brightway2 的负对数正态结果
Negative lognormal results in Monte Carlo simulation with Brightway2
我不知道如何设置 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' 信息根据正值计算的,然后根据'amount' 信息。这是对具有负排放的清单执行 MC 所必需的。有什么线索吗?谢谢
有两个问题阻止了预期的行为:
- 在字段中给出负值是不够的
amount
; RNG 代码在 stats_arrays library, and you must set the field negative
to True
(see docs).
brightway2-data
中存在错误,已在 7e3341c and release 2.4.6 中修复,该错误阻止了密钥 negative
在 exchange.uncertainty
中使用。
一般来说,当从其他格式导入数据时,negative
字段会自动设置,例如SimaPro CSV, Ecospold 1. Moreover, when a database is processed to a parameter array, the negative
field is also always set 来自 amount field
。这种情况下的区别在于您直接从 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 ])
我不知道如何设置 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' 信息根据正值计算的,然后根据'amount' 信息。这是对具有负排放的清单执行 MC 所必需的。有什么线索吗?谢谢
有两个问题阻止了预期的行为:
- 在字段中给出负值是不够的
amount
; RNG 代码在 stats_arrays library, and you must set the fieldnegative
toTrue
(see docs). brightway2-data
中存在错误,已在 7e3341c and release 2.4.6 中修复,该错误阻止了密钥negative
在exchange.uncertainty
中使用。
一般来说,当从其他格式导入数据时,negative
字段会自动设置,例如SimaPro CSV, Ecospold 1. Moreover, when a database is processed to a parameter array, the negative
field is also always set 来自 amount field
。这种情况下的区别在于您直接从 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 ])