Stata中的重塑和合并模拟



我有一个数据集,它由1000个模拟组成。每个模拟的输出都保存为一行数据。存在变量alphabetasimulationid

以下是一个示例数据集:

simulationid    beta          alpha
1               0.025840106   20.59671241
2               0.019850549   18.72183088
3               0.022440886   21.02298228
4               0.018124857   20.38965861
5               0.024134726   22.08678021
6               0.023619479   20.67689981
7               0.016907209   17.69609466
8               0.020036455   24.6443037
9               0.017203175   24.32682682
10              0.020273349   19.1513272

我想估计一个新的值,我们称之为new,它取决于alphabeta以及另外两个变量的不同级别,我们称其为riskpricerisk的值范围为0到100,price的值范围从0到500,步长为5。

我想要实现的是一个数据集,该数据集由表示riskprice的组合的new大于0的概率的值组成。

我可以使用下面的代码来实现这一点。然而,reshape过程所花费的时间比我希望的要多。在我看来,这是一件可以更快完成的事情。

所以,我的问题是:

i) 有没有一种有效的方法可以在没有多个reshape或的情况下从一行数据生成多个数据集

ii)我是不是完全错了?

set maxvar 15000
/* Input sample data */
input     simulationid  beta          alpha
1               0.025840106   20.59671241
2               0.019850549   18.72183088
3               0.022440886   21.02298228
4               0.018124857   20.38965861
5               0.024134726   22.08678021
6               0.023619479   20.67689981
7               0.016907209   17.69609466
8               0.020036455   24.6443037
9               0.017203175   24.32682682
10              0.020273349   19.1513272
end

forvalues risk = 0(1)100 {
forvalues price = 0(5)500 {
    gen new_r`risk'_p`price' = `price' * (`risk'/200)* beta - alpha
        gen probnew_r`risk'_p`price' = 0
        replace probnew_r`risk'_p`price' = 1 if new_r`risk'_p`price' > 0
        sum probnew_r`risk'_p`price', mean
        gen mnew_r`risk'_p`price' = r(mean)
    drop new_r`risk'_p`price' probnew_r`risk'_p`price'
}
}
drop if simulationid > 1
save simresults.dta, replace
forvalues risk = 0(1)100 {
    clear
    use simresults.dta
    reshape long mnew_r`risk'_p, i(simulationid) j(price)
    keep simulation price mnew_r`risk'_p
    rename mnew_r`risk'_p risk`risk'
    save risk`risk'.dta, replace
}
clear
use risk0.dta
forvalues risk = 1(1)100 {
    merge m:m price using risk`risk'.dta, nogen
    save merged.dta, replace
}

以下是您的问题的开始。

就我所见,您不需要多个数据集。

不同的reshapes和merges只是重新排列了第一个generated,这可以在一个数据集中完成。

这里的代码在第一个实例中仅用于alphabeta的一对值。要模拟1000次这样的观测,你需要1000倍以上的观测,即大约1000万次,这通常不是问题,并在阿尔法和贝塔之间循环。但这种循环可以是默认的。我们会做到的。

此代码已运行并且合法。它仅限于一对alphabeta

clear 
input     simulationid  beta          alpha
1               0.025840106   20.59671241
2               0.019850549   18.72183088
3               0.022440886   21.02298228
4               0.018124857   20.38965861
5               0.024134726   22.08678021
6               0.023619479   20.67689981
7               0.016907209   17.69609466
8               0.020036455   24.6443037
9               0.017203175   24.32682682
10              0.020273349   19.1513272
end
local N = 101 * 101 
set obs `N' 
egen risk = seq(), block(101) 
replace risk = risk - 1 
egen price = seq(), from(0) to(100)
replace price = 5 * price 
gen result = (price * (risk/200)* beta[1] - alpha[1]) > 0 
bysort price risk: gen mean = sum(result) 
by price risk: replace mean = mean[_N]/_N 

现在假设你第一次读取1000个值,这里有一个如何获得整个值的草图。此代码尚未经过测试。也就是说,您的数据集从1000个观测值开始;然后你把它放大到1000万左右,然后得到你的结果。技巧部分是使用下标的表达式来确保每个结果块都是针对不同的alpha, beta对的。这不是强制性的;你可以在一个循环中进行,但你需要在循环外使用generate,在循环内使用replace

local N = 101 * 101 * 1000 
set obs `N' 
egen risk = seq(), block(101) 
replace risk = risk - 1 
egen price = seq(), from(0) to(100)
replace price = 5 * price 
egen sim = seq(), block(10201) 
gen result = (price * (risk/200)* beta[ceil(_n/10201)] - alpha[ceil(_n/10201)]) > 0 
bysort sim price risk: gen mean = sum(result) 
by sim price risk: replace mean = mean[_N]/_N 

使用的其他设备:egen在块中设置;在不重复呼叫CCD_ 27的情况下获得平均值;直接使用true或false表达式。

注意:我还没有试着理解你在做什么,但在我看来,价格风险模拟条件定义了单个值,所以计算平均值看起来是多余的。但这可能在代码中,因为您希望在代码工作后为其添加更多细节。

NB2:这似乎是一个纯粹确定性的计算。根本不确定您是否需要此代码。

最新更新