Использование команд 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 для создания данных из матриц.

Другие вопросы по тегам