Merge Stata中的整形和合并仿真
我有一个数据集,由1000个模拟组成。每个模拟的输出都保存为一行数据。有变量Merge Stata中的整形和合并仿真,merge,simulation,stata,reshape,Merge,Simulation,Stata,Reshape,我有一个数据集,由1000个模拟组成。每个模拟的输出都保存为一行数据。有变量alpha、beta和simulationid 以下是一个示例数据集: simulationid beta alpha 1 0.025840106 20.59671241 2 0.019850549 18.72183088 3 0.022440886 21.02298228 4
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
的值范围为0到100,price
的值范围为0到500,步骤为5
我想要实现的是一个数据集,该数据集由表示(在整个模拟过程中)new
对于risk
和price
组合大于0的概率的值组成
我可以使用下面的代码实现这一点。然而,重塑
过程花费的时间比我想象的要多。在我看来,这是一件可以更快完成的事情
因此,我的问题是:
i) 是否有一种有效的方法可以从一行数据中生成多个数据集,而无需对多个进行重塑
,或者
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
}
这是你问题的开始 就我所知,您不需要多个数据集 各种
重塑
s和合并
s只需重新排列第一个生成的
d即可在一个数据集中完成
第一个实例中的代码仅用于alpha
和beta
的一对值。要模拟1000个这样的观测值,您需要1000倍以上的观测值,即大约1000万个,这通常不是问题,并且需要在Alpha和Beta上循环。但循环可以是默契的。我们会的
此代码已运行且合法。它仅限于一个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
对。这不是强制性的;您可以在循环中执行此操作,但随后需要在循环外生成并在循环内替换
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
在块中设置;无需重复调用汇总
,即可获得平均值;直接使用真或假表达式
注:我没有试图理解你在做什么,但在我看来,价格风险模拟条件定义了单个值,因此计算平均值看起来是多余的。但这可能是因为您希望在代码正常工作后为代码添加更多细节
NB2:这似乎是一个纯粹的确定性计算。不确定您是否需要此代码 谢谢,@NickCox-question进行了相应的编辑。代码中使用的所有数据集都是由代码生成的。如果样本数据是输入
谢谢,@Nick,代码将运行。抱歉没有及时回复。这并没有达到我的期望,但它可能包含必要的组件。我会尝试找出答案,并在适当的时候编辑这个问题/答案。如果你有一个问题,我会从头开始问另一个问题。这条线已经太乱了,不能承受太多的复杂。