從 @RISK、ModelRisk 或 Analytic Solver 移轉模型
xellstorm 不需增益集,就能開啟專為 @RISK、ModelRisk 或 Analytic Solver 建立的 Excel 檔案,讀出其中 164 個分配函數,把每個這類公式轉成輸入,參數仍連結到儲存格。執行前會先列出轉換了什麼,以及每個沒轉換的公式和原因。
這 164 個函數中,@RISK 有 53 個、ModelRisk 有 62 個、Analytic Solver 有 49 個。另外也支援 65 種以百分位數指定分配的寫法,以及截斷、輸出標記、相關矩陣和多重模擬表。
匯入會從 @RISK 檔案讀出什麼
範例取自專案應變準備金的營建估算,改寫成 @RISK 模型的寫法:每個成本項目是該列儲存格上的 =RiskPert(min, most likely, max, RiskName(label)),每個風險事件是以機率為參數的 RiskBernoulli,總成本和超支用 RiskOutput 標記,結構與 MEP 用 RiskCorrmat 設定相關性,三個預算放在同一個 RiskSimtable,另有一個儲存格用 RiskMean 回報總成本的平均值。第二張工作表「Demonstrations」有五個獨立的公式:兩個能轉換的算術形式,三個無法轉換的公式。檔案是我們用指令碼產生的;xellstorm 讀取它不需要 @RISK,您也不需要。
在應用程式中,Distributions 步驟的 Import from workbook 會列出找到的公式(命令列的 xellstorm import 印出的清單相同)。這個檔案共轉換出 12 個輸入:6 個成本項目、4 個風險事件和 2 個算術示範。成本項目與風險事件的參數仍連結到儲存格,所以改了檔案裡的最小值或機率,下次執行就會跟著變;RiskName(A3) 則依該列的文字為輸入命名。能轉換的兩個,一個是乘上係數的常態抽樣,另一個的平均值由另一個儲存格算出。估算的輸出都沒有用到這兩個。
| 儲存格 | 檔案中的公式 | 轉換為 |
|---|---|---|
| E3 | =RiskPert(B3, | 場地工程:PERT,最小 B3(100)、最可能 C3(120)、最大 D3(170) |
| E4 | =RiskPert(B4, | 基礎:PERT,最小 B4(300)、最可能 C4(340)、最大 D4(460) |
| E5 | =RiskPert(B5, | 結構:PERT,最小 B5(760)、最可能 C5(820)、最大 D5(1,010) |
| E6 | =RiskPert(B6, | MEP:PERT,最小 B6(540)、最可能 C6(610)、最大 D6(780) |
| E7 | =RiskPert(B7, | 裝修:PERT,最小 B7(400)、最可能 C7(450)、最大 D7(560) |
| E8 | =RiskPert(B8, | 設備:PERT,最小 B8(260)、最可能 C8(280)、最大 D8(330) |
| D11 | =RiskBernoulli(B11, | 地質條件:白努利,機率 B11(0.25) |
| D12 | =RiskBernoulli(B12, | 設計變更:白努利,機率 B12(0.35) |
| D13 | =RiskBernoulli(B13, | 供應商延誤:白努利,機率 B13(0.2) |
| D14 | =RiskBernoulli(B14, | 惡劣天氣:白努利,機率 B14(0.3) |
| Demonstrations!B3 | =RiskNormal(100, | 平均值 100、標準差 10 的常態,抽樣值再乘以 1.1;僅作示範,估算沒有用到 |
| Demonstrations!B4 | =RiskNormal(Estimate!C3*1.1, | 平均值為 Estimate!C3*1.1(132)、標準差為 10 的常態;僅作示範,估算沒有用到 |
同一次匯入也會讀取模型的其餘部分:
- 輸出。標有
RiskOutput("Total cost")與RiskOutput("Over budget")的儲存格會成為輸出,沿用這些名稱。標記會加 0(與 @RISK 相同),儲存格因此照常計算。 - 相關性。
RiskCorrmat(Correlation,1)與RiskCorrmat(Correlation,2)把結構與 MEP 放進名為 Correlation 的矩陣,等級相關為 0.6(只填下三角;空白的儲存格取對角線另一側的對應值)。數值是匯入當下依檔案裡矩陣的內容讀取,匯入結果也會註明這一點。 - 模擬。在 @RISK 中,
RiskSimtable({2900,3000,3100})讓預算每次模擬取一個值。xellstorm 的基準執行把預算固定為 2,900,另外兩個值加成情境;情境抽取的亂數與基準執行相同,所以彼此只差在預算。 - 統計量。
RiskMean和其他把結果回報到儲存格的函數一樣,不是分配,所以不列為未轉換。離開 @RISK 後它沒有值(相容性檢查會指出該儲存格);平均值請看 xellstorm 的結果。
無法轉換的公式也會列出。第二張工作表上的 3 個公式都附有匯入給出的原因,也都有解決辦法:
| 公式 | 給出的原因 | 處理方式 |
|---|---|---|
=RiskBinomial(1, | 一個公式中有多個分配時不轉換;請讓每個分配各用一個輸入儲存格 | 拆開它:一個儲存格放 =RiskBernoulli(0.3) 表示風險是否發生,一個放 =RiskTriang(20,40,80) 表示影響,再用第三個儲存格相乘,估算中的風險事件就是這樣做的。 |
=RISKCOMPOUND(RiskPoisson(3), | RISKCOMPOUND 在 xellstorm 中沒有完全對應的函數 | xellstorm 沒有複合分配。請把次數和大小分別放在各自的儲存格中建模,或不要把該儲存格放進模型。 |
=RISKPERTALT(10%, | RISKPERTALT 在 xellstorm 中沒有完全對應的函數 | 請直接輸入 PERT 的最小、最可能與最大值(RiskPert),或把百分位數交給能轉換的 RiskTrigen。 |
執行轉換後的模型
用匯入的設定執行 5,000 次試驗,平均總成本為 2,784.7(單位:千美元)。同樣這些分配的理論平均值是 2,784.7,算法是 PERT 平均值 (最小 + 4 × 最可能 + 最大) / 6,加上各風險的機率乘以影響;模擬平均值的標準誤為 1.7。結構與 MEP 的等級相關達到 0.60。RiskSimtable 的三個預算,以基準和兩個情境執行的結果如下:
| 執行 | 預算 | 超出的機率 |
|---|---|---|
| 基準執行(Simulation 1) | 2,900 | 17.7% |
| Simulation 2 | 3,000 | 5.2% |
| Simulation 3 | 3,100 | 0.7% |
預算越大,超出的頻率越低。各情境抽取的數字與基準執行相同,所以各列的差異完全來自預算,而不是抽樣。
結果會與增益集一致嗎?
模型相同,亂數不同。匯入的每條規則把一個函數對應到它所描述的分配,參數照廠商文件的定義轉換,並與對應的 scipy 分配比對測試;產生測試資料的指令碼也會依廠商文件記載的公式,檢查每個對應的平均值。所以只要檔案中的每個分配都能轉換,平均值和百分位數與增益集的差異就只來自抽樣雜訊,試驗次數越多,雜訊越小:上方的標準誤就是平均值預期的雜訊大小。
相關性是等級相關,定義與 @RISK、Analytic Solver 相同,xellstorm 也能達到指定的等級相關。至於如何配對抽樣值來達成,各工具做法不同,所以有相關性的模型,兩端極端值的差異可能比單純的抽樣雜訊所能解釋的略大。檔案本身不會更動:xellstorm 只讀取,模型仍可在增益集中開啟。
可轉換的內容
- 分配與算術引數。分配可以單獨出現,也可以乘上一個正的乘數,再加或減至多一個偏移量:
RiskNormal(B1*1.1,B2)*C1+5與5+C1*RiskNormal(B1,B2)都能轉換。引數、乘數與偏移量可以用數字、單一儲存格參照、括號以及+、−、*、/。指向單一儲存格的已定義名稱會換成該儲存格的位址。這些運算式保持連結,在套用各情境的固定儲存格之後才計算;每個參照都必須是確定的(不含隨機)。表中標有 † 的函數仍只能用數字轉換。 - 百分位數形式。@RISK 的
…Alt與…AltD函數,以及 Analytic Solver 的…Alt函數(即下表中的那些)以百分位數指定分配;執行時 xellstorm 會精確求解,若沒有任何分配、或有多個分配符合,就回報錯誤。 - 截斷與平移。
RiskTruncate、RiskTruncate2、RiskTruncateP、RiskShift、VoseXBounds、VosePBounds、VoseShift、PsiTruncate、PsiTruncateP與PsiShift,依各增益集文件記載的順序套用。分配外層的乘數與偏移量隨後套用,並另外顯示在該輸入的設定裡。 - 名稱與鎖定。
RiskName、PsiName與VoseInput為輸入命名;RiskLock把輸入固定在單一值。目錄中另列出會忽略的屬性(Static、Units、Category、Collect、Base、Seed、IsDiscrete、IsDate、Fit、FitInfo、Certify、BaseCase、Library 與 SixSigma,皆帶廠商前綴)。RiskSeed會發出警告:它的隨機串流設定不會保留,抽樣由 xellstorm 的模擬亂數種子與輸入順序決定。 - 輸出。
RiskOutput、VoseOutput、PsiOutput與PsiSimOutput標記輸出;在 Analytic Solver 中,PsiMean(B1)這類統計量也會讓 B1 成為輸出,這裡同樣如此。 - 相關性與模擬。
RiskCorrmat、RiskDepC搭配RiskIndepC、PsiCorrMatrix、PsiCorrDepen搭配PsiCorrIndep;RiskSimtable、VoseSimTable與PsiSimParam。 - Excel 本身的公式。
NORM.INV(RAND(), mean, sd)、RANDBETWEEN、IF(RAND() < p, 1, 0)等,這類形式共 18 種,列在下方。
無法轉換的內容
下列情況無法轉換:同一個儲存格有多個分配;分配放在另一個函數內或分母中;直接對分配做除法;需要改變運算順序的連鎖運算。例如 (RiskNormal(0,1)+5)*2 與 RiskNormal(0,1)*2*3 會保持原樣並列出原因。RiskNormal(0,1)*(1/C1) 則在 C1 算出有限的正乘數時可以轉換,因為公式先明確算出倒數再相乘。乘數算出來是零或負數、引數呼叫函數或依賴隨機儲存格、沒有精確對應的函數(複合分配、時間序列函數、RiskPertAlt 與其他以兩個形狀參數指定的百分位數形式)、ModelRisk 的 U 引數與 copula,以及表中沒有的屬性,同樣不支援。引擎無法計算不支援的增益集公式;相容性檢查會指出是哪一個。
支援的函數
這些表格由匯入器自己的規則清單產生,所以列出的正是能轉換的全部內容。「百分位數」標示以百分位數指定分配的寫法;† 標示只能用數字轉換的函數。每個分配下方是它在 xellstorm 規格中的名稱。
| 分配 (xellstorm 名稱) | @RISK | ModelRisk | Analytic Solver |
|---|---|---|---|
白努利bern | RiskBernoulli | VoseBernoulli | PsiBernoulli |
貝他beta | RiskBetaRiskBetaGeneralRiskBetaSubj† | VoseBetaVoseBeta4VoseBetaSubj† | PsiBetaPsiBetaGenPsiBetaSubj† |
二項binom | RiskBinomial | VoseBinomial | PsiBinomial |
Burr XIIburr12 | RiskBurr12 | — | — |
柯西cauchy | RiskCauchy百分位數: RiskCauchyAltRiskCauchyAltD | VoseCauchy | — |
卡方chi2 | RiskChiSq百分位數: RiskChiSqAltRiskChiSqAltD | VoseChiSq | PsiChiSquare百分位數: PsiChiSquareAlt |
Chi(卡)、馬克士威chi | — | VoseChiVoseMaxwell | — |
累積cumul | RiskCumulRiskCumulD† | VoseCumulAVoseCumulD†VoseOgive† | PsiCumul |
Dagum(Burr III)burr | RiskDagum | VoseDagum | PsiDagum |
離散custom | RiskDiscreteRiskDUniform | VoseDiscreteVoseDUniform | PsiDiscretePsiDisUniform |
指數expon | RiskExpon百分位數: RiskExponAltRiskExponAltD | VoseExponVoseExponential | PsiExponential百分位數: PsiExponentialAlt |
極值(最大值,Gumbel)gumbel_r | RiskExtValue百分位數: RiskExtValueAltRiskExtValueAltD | VoseExtValueMax | PsiMaxExtreme百分位數: PsiMaxExtremeAlt |
極值(最小值)gumbel_l | RiskExtValueMin百分位數: RiskExtValueMinAltRiskExtValueMinAltD | — | PsiMinExtreme百分位數: PsiMinExtremeAlt |
Ff | RiskF | VoseF | PsiFDist |
疲勞壽命(Birnbaum–Saunders)fatiguelife | RiskFatigueLife百分位數: RiskFatigueLifeAltRiskFatigueLifeAltD | VoseFatigue | PsiFatigueLife百分位數: PsiFatigueLifeAlt |
Fréchetinvweibull | RiskFrechet百分位數: RiskFrechetAltRiskFrechetAltD | — | PsiFrechet百分位數: PsiFrechetAlt |
伽瑪、愛爾朗gamma | RiskGammaRiskErlang百分位數: RiskGammaAltRiskGammaAltD | VoseGammaVoseErlang | PsiGammaPsiErlang百分位數: PsiGammaAlt |
一般(相對權重)general | RiskGeneral | VoseRelative | — |
廣義柏拉圖genpareto | — | VoseGPD | — |
直方圖histogram | RiskHistogrm | VoseHistogram | PsiHistogram |
雙曲正割hypsecant | RiskHypSecant百分位數: RiskHypSecantAltRiskHypSecantAltD | VoseHS | PsiHypSecant |
超幾何hypergeom | RiskHypergeo | VoseHypergeo | PsiHyperGeo |
整數均勻randint | RiskIntUniform | VoseIntUniformVoseStepUniform† | PsiIntUniform |
逆高斯invgauss | RiskInvgauss百分位數: RiskInvgaussAltRiskInvgaussAltD | VoseInvGauss | PsiInvNormal |
Johnson SBjohnsonsb | RiskJohnsonSB | VoseJohnsonB | PsiJohnsonSB |
Johnson SUjohnsonsu | RiskJohnsonSU | VoseJohnsonU | PsiJohnsonSU |
Kumaraswamykumaraswamy | RiskKumaraswamy | VoseKumaraswamyVoseKumaraswamy4 | PsiKumaraswamy |
拉普拉斯laplace | RiskLaplace百分位數: RiskLaplaceAltRiskLaplaceAltD | VoseLaplace | — |
Lévylevy | RiskLevy百分位數: RiskLevyAltRiskLevyAltD | VoseLevy | PsiLevy百分位數: PsiLevyAlt |
對數邏輯斯fisk | RiskLogLogistic百分位數: RiskLogLogisticAltRiskLogLogisticAltD | VoseLogLogistic | PsiLogLogistic百分位數: PsiLogLogisticAlt |
邏輯斯logistic | RiskLogistic百分位數: RiskLogisticAltRiskLogisticAltD | VoseLogistic | PsiLogistic百分位數: PsiLogisticAlt |
對數常態lognorm | RiskLognormRiskLognorm2百分位數: RiskLognormAltRiskLognormAltD | VoseLognormalVoseLognormalE | PsiLogNormalPsiLognormPsiLognorm2百分位數: PsiLogNormalAlt |
負二項、幾何nbinom | RiskGeometRiskNegbin | VoseGeometricVoseNegBinVoseNegBinomVosePolya† | PsiGeometricPsiNegBinomial |
常態norm | RiskNormalRiskErf†百分位數: RiskNormalAltRiskNormalAltD | VoseNormalVoseErf† | PsiNormalPsiErf†百分位數: PsiNormalAlt |
柏拉圖pareto | RiskPareto百分位數: RiskParetoAltRiskParetoAltD | VosePareto | PsiPareto百分位數: PsiParetoAlt |
柏拉圖 II(Lomax)lomax | RiskPareto2百分位數: RiskPareto2AltRiskPareto2AltD | VosePareto2 | PsiPareto2百分位數: PsiPareto2Alt |
Pearson V(逆伽瑪)invgamma | RiskPearson5百分位數: RiskPearson5AltRiskPearson5AltD | VosePearson5 | PsiPearson5百分位數: PsiPearson5Alt |
Pearson VI(beta prime)betaprime | RiskPearson6 | VosePearson6 | PsiPearson6 |
PERTpert | RiskPert | VosePERTVoseModPERT | PsiPert |
卜瓦松poiss | RiskPoisson | VosePoisson | PsiPoisson |
瑞利rayleigh | RiskRayleigh百分位數: RiskRayleighAltRiskRayleighAltD | VoseRayleigh | PsiRayleigh百分位數: PsiRayleighAlt |
倒數(對數均勻)loguniform | RiskReciprocal | VoseReciprocal | PsiReciprocal |
學生 tt | RiskStudent百分位數: RiskStudentAltRiskStudentAltD | VoseStudentVoseStudent3† | PsiStudent百分位數: PsiStudentAlt |
三角triang | RiskTriang | VoseTriangle | PsiTriangular |
由百分位數定義的三角(Trigen)trigen | RiskTrigen百分位數: RiskTriangAlt | VoseTriangleAlt | PsiTriangGen |
均勻unif | RiskUniform百分位數: RiskUniformAltRiskUniformAltD | VoseUniform | PsiUniform |
韋伯weibull_min | RiskWeibull百分位數: RiskWeibullAltRiskWeibullAltD | VoseWeibullVoseWeibull3 | PsiWeibull百分位數: PsiWeibullAlt |
| 公式 | xellstorm |
|---|---|
=NORM.INV(RAND(), | norm (loc, scale) |
=NORMINV(RAND(), | norm (loc, scale) |
=mean + sd*NORM.S.INV(RAND()) | norm (loc, scale) |
=LOGNORM.INV(RAND(), | lognorm (mu, sigma) |
=LOGINV(RAND(), | lognorm (mu, sigma) |
=GAMMA.INV(RAND(), | gamma (a, scale) |
=GAMMAINV(RAND(), | gamma (a, scale) |
=BETA.INV(RAND(), | beta (a, b) |
=BETA.INV(RAND(), | beta (a, b, min, max) |
=BETAINV(RAND(), | beta (a, b, min, max) |
=BINOM.INV(n, | binom (n, p) |
=CRITBINOM(n, | binom (n, p) |
=RANDBETWEEN(a, | randint (min, max) |
=a + (b - a)*RAND() | unif (min, max) |
=a + s*RAND() | unif (loc, scale) |
=RAND() | unif |
=IF(RAND() < p, | bern (p) |
=IF(RAND() < p,† | custom (x, prob) |
| 函數 | 增益集 | 在 xellstorm 中轉換為 |
|---|---|---|
RiskTruncate | @RISK | 截斷:truncate_min、truncate_max(在任何平移之前) |
RiskTruncate2 | @RISK | 截斷:平移後數值的 truncate_min、truncate_max(再依平移量移回) |
RiskTruncateP | @RISK | 截斷:truncate_pmin、truncate_pmax(分配的百分位數) |
RiskShift | @RISK | 平移:shift |
RiskName | @RISK | 名稱:輸入的名稱 |
RiskLock | @RISK | 鎖定:固定值(RiskLock(v),或 RiskStatic 的值) |
RiskCorrmat | @RISK | 相關性:同一矩陣內各輸入之間的等級相關 |
RiskDepC | @RISK | 相關性:與同名配對的輸入之間的等級相關 |
RiskIndepC | @RISK | 相關性:與同名配對的輸入之間的等級相關 |
RiskSimtable | @RISK | 每次模擬一個值:基準執行中固定該儲存格,之後每次模擬各成一個情境 |
RiskOutput | @RISK | 輸出:名稱沿用函數所給的名稱 |
VoseXBounds | ModelRisk | 截斷:truncate_min、truncate_max(在任何平移之前) |
VosePBounds | ModelRisk | 截斷:truncate_pmin、truncate_pmax(分配的百分位數) |
VoseShift | ModelRisk | 平移:shift |
VoseInput | ModelRisk | 名稱:輸入的名稱 |
VoseSimTable | ModelRisk | 每次模擬一個值:基準執行中固定該儲存格,之後每次模擬各成一個情境 |
VoseOutput | ModelRisk | 輸出:名稱沿用函數所給的名稱 |
PsiTruncate | Analytic Solver | 截斷:類型 1(預設):在任何平移之前的 truncate_min、truncate_max;-1:平移後的數值;3:truncate_pmin、truncate_pmax |
PsiTruncateP | Analytic Solver | 截斷:truncate_pmin、truncate_pmax(分配的百分位數) |
PsiShift | Analytic Solver | 平移:shift |
PsiName | Analytic Solver | 名稱:輸入的名稱 |
PsiCorrMatrix | Analytic Solver | 相關性:同一矩陣內各輸入之間的等級相關 |
PsiCorrDepen | Analytic Solver | 相關性:與同名配對的輸入之間的等級相關 |
PsiCorrIndep | Analytic Solver | 相關性:與同名配對的輸入之間的等級相關 |
PsiSimParam | Analytic Solver | 每次模擬一個值:基準執行中固定該儲存格,之後每次模擬各成一個情境 |
PsiOutput | Analytic Solver | 輸出:該儲存格本身,或其參照的儲存格 |
PsiSimOutput | Analytic Solver | 輸出:該儲存格本身,或其參照的儲存格 |
PsiMean | Analytic Solver | 統計量:第一個引數的儲存格成為輸出(與所有 Psi 統計量對輸出的處理相同) |
常見問題
需要安裝 @RISK、ModelRisk 或 Analytic Solver 嗎?
不需要。xellstorm 直接從 .xlsx 檔案讀取公式,用自己的引擎在瀏覽器計算模型,不需要 Excel 或增益集。請先將 .xls 與 .xlsb 檔案另存為 .xlsx。
xellstorm 會更動我的 Excel 檔案嗎?
不會。匯入只是把公式轉成 xellstorm 自己設定中的輸入,不會寫入電腦上的檔案,所以模型照樣能在增益集中開啟與執行。
相關矩陣會變成什麼?
共用同一個 RiskCorrmat 或 PsiCorrMatrix 範圍的輸入,會取得該矩陣的等級相關,數值在匯入時從儲存格讀取;RiskDepC 與 PsiCorrDepen 則把輸入與同名的輸入配成一對。讀不到的配對(矩陣不是方陣、位置在矩陣之外、儲存格沒有數字)會寫在匯入的附註中;沒能轉換的輸入連同原因列出,並從所屬的配對中排除。若矩陣不是有效的相關矩陣,xellstorm 會改用最接近的有效矩陣,應用程式也會在執行前顯示。
RiskSimtable 會變成什麼?
第一個值在基準執行中固定該儲存格,之後每個值各成一個情境,依序命名為 Simulation 2、Simulation 3,以此類推。情境抽取的亂數與基準執行相同,所以彼此的差異完全來自表中的值。
@RISK、ModelRisk 與 Analytic Solver 皆為各自所有人的商標。xellstorm 與它們並無關聯;這裡提到函數名稱,只是說明 xellstorm 讀得懂哪些內容。
相關內容
- 專案成本與時程
營建專案需要多少應變準備金?
實作範例:營建估算中各項最可能成本,有 94.2% 的模擬結果會超出。用蒙地卡羅模擬估出營建成本應變準備金。 - 指南
Excel 蒙地卡羅模擬:有無增益集的做法
Excel 模型做蒙地卡羅模擬的三種方式:RAND() 加資料表、增益集,或免增益集的瀏覽器工具。附 PERT 公式。 - 指南
Excel 的 PERT 分配:公式、平均值與使用時機
PERT 是從最小值到最大值的貝他分配,平均值為 (最小 + 4 × 最可能 + 最大)/6。附 Excel 的 BETA.INV 公式,以及 PERT 與三角分配的比較。
xellstorm 是在瀏覽器中執行的 Excel 模型蒙地卡羅模擬工具:免裝增益集,Excel 檔案也不會離開您的電腦。