我有一个数据集,它由1000个模拟组成。每个模拟的输出都保存为一行数据。存在变量alpha
、beta
和simulationid
。
以下是一个示例数据集:
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
,它取决于alpha
和beta
以及另外两个变量的不同级别,我们称其为risk
和price
。risk
的值范围为0到100,price
的值范围从0到500,步长为5。
我想要实现的是一个数据集,该数据集由表示risk
和price
的组合的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
}
以下是您的问题的开始。
就我所见,您不需要多个数据集。
不同的reshape
s和merge
s只是重新排列了第一个generate
d,这可以在一个数据集中完成。
这里的代码在第一个实例中仅用于alpha
和beta
的一对值。要模拟1000次这样的观测,你需要1000倍以上的观测,即大约1000万次,这通常不是问题,并在阿尔法和贝塔之间循环。但这种循环可以是默认的。我们会做到的。
此代码已运行并且合法。它仅限于一对alpha
、beta
。
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:这似乎是一个纯粹确定性的计算。根本不确定您是否需要此代码。