Merge Stata中的整形和合并仿真

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

我有一个数据集,由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
的值范围为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,代码将运行。抱歉没有及时回复。这并没有达到我的期望,但它可能包含必要的组件。我会尝试找出答案,并在适当的时候编辑这个问题/答案。如果你有一个问题,我会从头开始问另一个问题。这条线已经太乱了,不能承受太多的复杂。