【发布时间】:2015-12-04 12:11:38
【问题描述】:
我有一个数据集,其中包含 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。
我想要实现的是一个数据集,其中包含的值表示(在模拟中)new 对于risk 和price 的组合大于 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
}
【问题讨论】:
-
谢谢,@NickCox - 问题已相应编辑。
-
代码中用到的所有数据集都是代码生成的。如果示例数据为
input,则代码将运行
标签: merge simulation stata reshape