在 ecoinvent 3.10 中,Chris Mutel 和 Pascal Lesage here 发布的 multiImpactMonteCarloLCA 函数生成的 Monte Carlo 结果明显高于 LCA 分数,并且 10,000 次迭代的较长运行有时会包含 NaN 结果。
不久前,我在 ecoinvent 3.8 中使用了 multiImpactMonteCarloLCA 函数,并且得到了非常有意义的结果。然而,最近,使用 ecoinvent 3.10(截止),我始终收到明显高于 LCA 分数的蒙特卡洛结果,并且 10,000 次迭代的较长运行有时会包含 NaN 结果。我发现 Ecoinvent 3.91(截止)也发生同样的情况。我目前没有回滚到 ecoinvent 3.8。我想知道 ecoinvent 3.10 不确定性元数据的更改是否与 multiImpactMonteCarloLCA 不兼容?
下面是一些代码来说明该问题,其中我生成了 LCA 分数,并对 1 千克铬钢的 GWP 进行了 100 次短期迭代(以消除问题出在我的库存数据上的可能性)。预先感谢您的任何诊断或解决方法。 (虽然不方便,但如果这是最及时的解决方案,我可以将我的项目回滚到ecoinvent 3.8。)
ei310 = bw.Database('ecoinvent-3.10-cutoff')
chromiumSteelActivity = ei310.get('3a2caa153f4b39980c02f7a307874b83') # 'market for steel, chromium steel 18/8' (kilogram, GLO, None)
functional_unit = {chromiumSteelActivity: 1}
ipcc_2021_method = ('IPCC 2021', 'climate change', 'global warming potential (GWP100)')
method_list = [ipcc_2021_method]
lca = bw.LCA(functional_unit, ipcc_2021_method)
lca.lci()
lca.lcia()
print('GWP of 1 kg chromium steel =', lca.score)
# Code adapted from a Brightway2 seminar presented by Chris Mutel and Pascal Lesage:
# https://github.com/PoutineAndRosti/Brightway-Seminar-2017/blob/master/Day%201%20PM/Brightway%20and%20uncertainty.ipynb
def multiImpactMonteCarloLCA(functional_unit, method_list, iterations):
# Create A and B matrices ready for Monte Carlo
MC_lca = bw.MonteCarloLCA(functional_unit)
MC_lca.lci()
# Create dictionary for method name : characterization factor (C) matrices
C_matrices = {}
# Loop through method names and populate the C_matrices dictionary
for method in method_list:
MC_lca.switch_method(method)
C_matrices[method] = MC_lca.characterization_matrix
# Create results array with rows = number of methods, columns = number of iterations
results = np.empty((len(method_list), iterations))
# Loop through the Monte Carlo iterations and populate the results array
for iteration in range(iterations):
next(MC_lca)
for method_index, method in enumerate(method_list):
results[method_index, iteration] = (C_matrices[method]*MC_lca.inventory).sum()
return results
# Confidence interval code by Xavier Guihot, posted on stackoverflow.com
def confidence_interval(data, confidence=0.95):
dist = NormalDist.from_samples(data)
z = NormalDist().inv_cdf((1 + confidence) / 2.)
h = dist.stdev * z / ((len(data) - 1) ** .5)
return dist.mean - h, dist.mean, dist.mean + h
# Find mean and 95% confidence interval for Monte Carlo results
test_results = multiImpactMonteCarloLCA(functional_unit, method_list, 100)
lower_95th, mean, upper_95th = confidence_interval(test_results[method_index])
print('Lower 95th =', lower_95th, 'Mean = ', mean, 'Upper 95th =', upper_95th)
Output from the above:
GWP of 1 kg chromium steel = 5.110700854620202
Lower 95th = 5.779195233025968 Mean = 5.967848380411753 Upper 95th = 6.156501527797538
编辑:我相信我已经找到了解决这个问题的方法。使用“较新”方法(bw.import_ecoinvent_release(“3.10”,“cutoff”))导入ecoinvent 3.10后,我单独保留了ecoinvent-3.10-biosphere数据库,删除了ecoinvent-3.10-cutoff,然后使用重新导入它下面的“旧”方法:
ei310 = bw.SingleOutputEcospold2Importer(fpei310, 'ecoinvent-3.10-cutoff', reparametrize_lognormals = True)
ei310.apply_strategies()
ei310.statistics()
ei310.write_database()
fpei10 是手动下载并解压 ecoinvent 3.10_cutoff_ecoSpold02.7z 后数据集文件夹的本地文件路径。 通过此过程,“旧”方法会识别出匹配的 ecoinvent 生物圈数据库已就位,因此不会尝试重新导入它,并且 reparametrize_lognormals = True 开关可确保活动影响的中值与对数正态不确定性分布相匹配静态冲击结果。现在我收到了预期的结果。理想情况下,“较新”的导入方法将具有 reparametrize_lognormals 选项,这将避免需要上述解决方法,我将通过适当的渠道请求此操作。
顺便说一句,请接受我的道歉,因为我天真地发布了上面假设结果服从正态分布的置信区间函数!
我会将此查询保留到另一天,以防有人有任何其他或替代信息。
简而言之,删除 ecoinvent-3.10-cutoff 数据库并使用带有 reparametrize_lognormals = True 开关的 SingleOutputEcospold2Importer 重新导入它可以解决该问题。更多详细信息在我对我的问题的上述编辑中以斜体显示。