Использование команд postfile и post
При использовании post
Команда, я получаю следующую ошибку:
post command requires expressions be bound in parenthesis
Моя программа генерирует матрицу, которая хранит коэффициенты регрессии для каждого моделирования, а затем использует post
Команда объявить как float
и поместите вывод матрицы в круглые скобки (бета).
Образец кода:
*Priors
set more off
global nmc=10
global l = 4 /* number of lags */
global cnt=150 /* number of countries */
set seed 10101
* Gen empty beta matrix
matrix betas = J(153,$nmc+1,.)
*** THIS IS WHERE MONTECARLO STARTS***
program bootStrapCH5, rclass
tempname sim
postfile `sim' betas using results, replace /* As trial I'll create only the betas matrix for now. */
*postfile `sim' betas alpha_mean b1_mean b2_mean b3_mean b4_mean se_alpha se1 se2 se3 se4 using results, replace
quietly {
forvalues i = 1/$nmc {
* Fixed effects regression.
reg gdp_growth_wb L(1/4).gdp_growth_wb i.id
matrix B1= e(b)
mat li B1
predict g_hat,xb
gen e_hat= gdp_growth_wb - g_hat
*gen flag=e(sample)
* Generate the "wild" errors for the forecasts
gen eta=rnormal()
gen e_star=e_hat*eta
**RECURSION
levelsof id, local(codes)
capture noisily replace y_star= _b[_cons] + _b[L.gdp_growth_wb]*L.y_star + ///
_b[L2.gdp_growth_wb]*L2.y_star + _b[L3.gdp_growth_wb]*L3.y_star + ///
_b[L4.gdp_growth_wb]*L4.y_star + e_star if (id==1 & Dini4forward==1)
forvalues cc= 2(1)150 {
capture noisily replace y_star= _b[_cons] + _b[`cc'.id] + _b[L.gdp_growth_wb]*L.y_star + ///
_b[L2.gdp_growth_wb]*L2.y_star + _b[L3.gdp_growth_wb]*L3.y_star + ///
_b[L4.gdp_growth_wb]*L4.y_star + e_star if (id==`cc' & Dini4forward==1)
}
*Regression with new sample: y_star
reg y_star L(1/4).y_star i.id
matrix b= e(b)'
matrix betas= (betas , b)
matrix list betas
post `sim' float (betas)
}
}
postclose `sim'
end
*Execute program
bootStrapCH5
use results, clear
summarize
Я также попробовал альтернативу:
post `sim' (betas)
И получил ошибку:
> type mismatch
post: above message corresponds to expression 1, variable betas
Любые идеи о том, как это исправить, очень ценятся.
1 ответ
Я не очень знаком с postfile
, но я думаю, что одной из проблем может быть то, что вы пытаетесь вставить матрицу kx2 в одну переменную внутри вашего цикла с помощью post
,
Когда вы начинаете postfile
с помощью:
postfile `sim' betas using results
вы объявили набор данных Stata с одной переменной, betas
,
Итак, вместо использования
post `sim' float (betas)
Вы можете попробовать:
tempname sim
postfile `sim' float (betas1 betas2) using results, replace
forvalues i = 1/$nmc {
* Some code. . .
local rows = rowsof(betas)
forvalues i = 1/`r' {
post `sim' (betas[`i',1]) (betas[`i',2])
}
* some other code. . .
}
или что-то подобное, чтобы объявить файл с правильным количеством переменных, которые вы намереваетесь post
в набор данных.
Кроме того, я не уверен, что вы можете post
матрица напрямую в любом случае (я могу ошибаться по этому поводу). Если вы не можете, то вы можете вложить forvalues
цикл внутри цикла, в настоящее время вы должны перебирать элементы betas
и публиковать их индивидуально - как я сделал в примере выше.
Наконец, вы пытаетесь привести значения betas
как тип данных плавают в вашем post
команда. Я считаю, что типы хранения должны быть объявлены в postfile
команда (но опять же, я могу ошибаться по этому поводу). Первая ошибка, которую вы цитируете (выражения в скобках) является прямым результатом включения float
в post
команда.
Итог - я подозреваю, что первая ошибка связана с объявлением типа данных при попытке post
данные, а вторая ошибка (несоответствие типов) является результатом попытки вставить матрицу kx2 в переменную. Ниже приведен пример несоответствия типов при попытке (некорректно) создать данные из матрицы:
clear *
mat a = (1\2)
set obs 2
gen x = a
Хотя я, по общему признанию, ожидал, что ошибка будет более похожа на это:
mat a = (1\2)
set obs 2
gen x = a*2
матричные операторы, которые возвращают матрицы, не разрешенные в этом контексте
Также посмотрите на svmat
для создания данных из матриц.