Loops 以变量作为Stata中的上限的循环

Loops 以变量作为Stata中的上限的循环,loops,statistics,stata,Loops,Statistics,Stata,我试图在stata中创建一个循环,它的上限是一个变量,而不是一个数字或局部宏 例如,如果num_tests是我想要的循环的上限: forval i = 1/num_tests{ //Do things here } 我尝试使用本地宏执行此操作: local j = num_tests forval i = 1/`j'{ //Do stuff } 然而,这只适用于第一次观察,并没有继续迭代其他观察。基本上,我希望for循环迭代一定次数,正如num_tests变量所指定的那样。我

我试图在stata中创建一个循环,它的上限是一个变量,而不是一个数字或局部宏

例如,如果num_tests是我想要的循环的上限:

forval i = 1/num_tests{
    //Do things here
}
我尝试使用本地宏执行此操作:

local j = num_tests
forval i = 1/`j'{
    //Do stuff
}
然而,这只适用于第一次观察,并没有继续迭代其他观察。基本上,我希望for循环迭代一定次数,正如num_tests变量所指定的那样。我知道我可能可以在循环中使用_N并以这种方式访问值,但据我所知,这是非常低效的,不推荐使用

更新:如果有帮助,这里有一些示例代码。num_tests是数据集中的一个变量,它的值介于1和6之间,具体取决于观察结果。因此,如果给定观测值的num_测试是三次,我希望循环执行三次

//Find results of only the first lab tests
forval i = 1/num_tests{

    replace val = `i' if `i' > val

    //Set tTG IgA results
    replace ttg_iga_result = real(test_result_`i') / real(high_ref_range_`i') if performed_test_cd_`i' == "5003030" | performed_test_cd_`i' == "9503207"

    //Set tTG IgG results
    replace ttg_igg_result = real(test_result_`i') / real(high_ref_range_`i') if performed_test_cd_`i' == "5003025" | performed_test_cd_`i' == "9503200"

    //Set regular IgA results - if variable is > 1, then the patient has low IgA levels
    replace iga_result = real(test_result_`i') if performed_test_cd_`i' == "1002860" 
}
任何帮助都将不胜感激

谢谢你抽出时间,
内特

我最后只是用_N让它工作:

//Local to hold total number of observations
local N = _N
forval j = 1/`N' {
    local num = num_tests[`j']

    forval i = 1/`num' {

        //Set tTG IgA results
        replace ttg_iga_result = real(test_result_`i') / real(high_ref_range_`i') in `j' if performed_test_cd_`i' == "5003030" | performed_test_cd_`i' == "9503207"

        //Set tTG IgG results
        replace ttg_igg_result = real(test_result_`i') / real(high_ref_range_`i') in `j' if performed_test_cd_`i' == "5003025" | performed_test_cd_`i' == "9503200"

        //Set regular IgA results - if variable is > 1, then the patient has low IgA levels
        replace iga_result = real(test_result_`i') in `j' if performed_test_cd_`i' == "1002860" 
    }
}

在我看来,这是一个问题,将数据从宽到长进行重塑将有助于解决这个问题。