Display local in stata forex no Brasil


Stata Programming Essentials Já precisava fazer o mesmo para dez variáveis ​​diferentes e desejava que você não tivesse que gravá-la dez vezes. Em caso afirmativo, este artigo é para você. Caso contrário, algum dia você vai querer, assim, você também pode continuar lendo de qualquer maneira. A Stata possui todas as ferramentas necessárias para escrever programas muito sofisticados, mas saber que apenas alguns deles permitem que você faça todos os dias os arquivos serem mais curtos e mais eficientes. Este artigo se concentrará nas ferramentas de programação que, em nossa experiência, qualquer pessoa que use Stata fortemente acabará querendo aprender. Para se beneficiar deste artigo, você precisará uma sólida compreensão da sintaxe básica do Stata, como você pode obter da nossa série Stata para Pesquisadores. O principal público pretendido é os usuários da Stata sem nenhuma outra experiência de programação. Se você já fez uma grande quantidade de programação da Stata e está procurando expandir seu quotbag de tricksquot, verifique as Ferramentas de Programação Stata. Este artigo é melhor lido no computador com o Stata em execução. Digitar os comandos nos exemplos você o ajudará a notar e manter todos os detalhes, e prepará-lo para escrever seu próprio código. Uma macro Stata é uma caixa na qual você colocou texto. Você então usa o que está na caixa em comandos subseqüentes. (O verdadeiro truque é obter um único comando para executar várias vezes com um bit diferente de texto na caixa cada vez - bem, chegar lá). O uso de macros bem são macros quotlocalquot. Se você está familiarizado com variáveis ​​globais e locais de outros idiomas, as macros locais Statas são locais da mesma maneira. Caso contrário, basta confiar em nós que macros locais são as corretas para usar. O comando para definir uma macro local é: nome do nome local. Isso cria uma macro local chamada x e coloca o caractere 1 nele (não o valor 1 como na quotone unidade à direita de zero na linha lineal). Para usar uma macro, você coloca seu nome em um comando, rodeado por um conjunto particular de aspas: A citação antes do x é a citação única esquerda. Encontra-se no canto superior esquerdo do teclado, sob o tilde (). A citação após o x é a citação única certa. É encontrado sob a aspa dupla (quot) no lado direito do teclado. As macros são manipuladas por um macro-processador que examina os comandos antes de passar para o Stata apropriado. Quando ele vê uma macro (denotada por esse conjunto particular de aspas), ela substitui a macro com sua tabela. Assim, o que o Stata apropriado viu foi: agora, tente uma macro ligeiramente mais complicada: exibição local x 22 x O resultado é 4. mas isso é porque o comando de exibição funciona como uma calculadora. O comando que a Stata viu foi: então avaliou 22 e lhe deu a resposta. Se você quiser que a tela apareça na tela sem avaliá-la, coloque-a entre aspas. Então, a exibição irá tratá-la como uma string. Dá o resultado 22. Mas considere o que aconteceu antes de colocá-lo entre aspas: sua macro continha um bit de trabalho do código Stata que Stata felizmente executou quando você usou. De fato, a Stata não sabia ou se preocupava que 22 provenesse de uma macro. Esse recurso permite que você use macros absolutamente em qualquer lugar, mesmo em definições de macro. Armazenando resultados em macros Se você quiser colocar o resultado de um cálculo em uma macro, coloque um sinal de igual após o nome da macro: quotxquot virtual de exibição x22 Se o comando local contém um sinal de igual, o Stata avaliará o que se segue antes de colocá-lo no Macro. Agora, x realmente contém 4 e não 22, não importa como você o exiba. Macro Expressions Statas macro processor pode avaliar as expressões Stata, ou seja, qualquer fórmula que você possa colocar após o sinal de igual a um comando gerar ou substituir (mas não egen). A sintaxe é: onde a expressão é a expressão a ser avaliada. Experimente: o resultado é 4. mas a exibição não o calculou (as citações impedem isso). Em vez disso, o sinal de igual antes de 22 disse ao macro-processador para avaliar essa expressão e colocar o resultado no código, então o que a Stata apropriado viu foi exibir quot4quot. Outro uso comum é N., que será o número de observações no conjunto de dados atual (e pode ser usado em lugares onde N por si só não). Expressões de macro - e macros em geral - podem conter outras macros. Tente: isso indica ao processador de macro para subtrair um do valor da macro x e, em seguida, coloque o resultado no código. Isso pode ser extremamente útil: por exemplo, se você tivesse um ano macro contendo o ano atual, o ano-1 seria o ano anterior ao ano em curso. Macros indefinidas Infelizmente, usando uma macro que você não definiu não gerou uma mensagem de erro. Statas macro processor apenas o substitui por nada: Dá o mesmo resultado que: Isso pode causar dores de cabeça: se você digitar um nome de macros provavelmente, você provavelmente receberá um erro de sintaxe genérico, sem indicação de que uma macro seja a causa do problema. Pior ainda, em algumas circunstâncias o comando ainda funcionará, mas dará resultados incorretos. Tenha muito cuidado para digitar os nomes das macros corretamente. Alguns usos para macros fora dos loops O principal motivo para aprender sobre macros é para que você possa usá-los em loops. Mas há momentos em que usá-los por si mesmos podem tornar o código complexo mais fácil de ler. Suponha que você precise executar um grande número de regressões de vários tipos, mas todos eles incluem um conjunto fixo de variáveis ​​de controle. Considere colocar a lista de variáveis ​​de controle em uma macro: controle localVars idade sexo ocupação local maritalStatus hasChildren Isso fará com que os comandos de regressão sejam mais curtos: reg income controlVars logit empregado controle de educaçãoVars Agora suponha que você trabalhe com freqüência com subamostra de seu conjunto de dados. Você também pode definir macros para elas: corrida local de raça negra1 amplificador feminino local hispMan raça2 amplificador controle de educação de renda de sexo femininoVars se blackWoman logit empregou controle de educaçãoVar se hispMan O ponto aqui não é salvar batidas de tecla, mas para tornar o código mais claro. O uso de macros esconde os detalhes de quais são as variáveis ​​de controle ou como uma mulher negra pode ser identificada neste conjunto de dados e ajuda você a se concentrar no que você está tentando fazer. Não é necessário digitar esses detalhes sempre que remove uma oportunidade de erro. Você também pode fazer alterações com mais rapidez: se você precisar adicionar uma variável de controle, só é necessário adicioná-la à definição da macro controlVars em vez de adicioná-la a cada comando de regressão. A poupança de teclas é um bom efeito colateral, mas resista à tentação de tornar seu código menos claro em nome de torná-lo mais curto. Tirar alguns minutos para digitar o código claro é muito mais eficiente do que gastar horas em depurar o código que é curto, mas difícil de entender. Um loop foreach leva uma lista e, em seguida, executa um comando ou conjunto de comandos para cada elemento da lista. O elemento que está sendo trabalhado atualmente é armazenado em uma macro para que você possa se referir aos comandos. A lista a ser enrolada pode ser uma lista genérica contendo texto, ou existem vários tipos de listas estruturadas (bem, apenas discuta varlists). A sintaxe de um loop foreach com uma lista genérica é: foreach macro no comando (s) de lista. Como um exemplo muito simples: foreach cor em vermelho azul verde exibir quotcolorquot Aqui, a cor é o nome da macro que conterá os elementos da lista. Vermelho azul-verde é a própria lista. Stata quebra a lista em elementos onde quer que veja espaços, então esta lista contém três elementos: vermelho. Azul e verde. O suporte de curvatura esquerdo () marca o fim do loop e deve seguir sua própria linha. Se você digitar isso na janela interativa Stata, os resultados adicionam números de linha para os comandos dentro do loop, mas você não precisa digitá-los. Observe como nada é realmente executado até que você digite o suporte de rir direito e, em seguida, o Stata executa o todo. Quando você obterá a seguinte saída: Stata começa por analisar sua lista e identificar os elementos que ela contém. Em seguida, coloca o primeiro elemento (vermelho) na macro de loops (cor) e executa o comando no loop. Dado as tabelas de cores. O comando torna-se exibido quotredquot e vermelho é impresso na tela. Stata coloca o segundo elemento na macro e executa o comando novamente, imprimindo azul na tela. Em seguida, ele repete o processo para o verde. E quando isso é feito, Stata percebe que a lista está fora de elementos e o loop foreach está completo. Ao longo deste artigo, você verá que os comandos que estão dentro de um loop são recuados. Isso faz com que a estrutura dos laços seja visualmente óbvia e recomendamos que você faça o mesmo ao escrever arquivos. Tudo o que você precisa fazer é pressionar Tab antes de começar a primeira linha do loop. Statas do editor de arquivos e qualquer outro editor de texto adequado para programação irá recuar as linhas subsequentes automaticamente. (Não há necessidade de se preocupar com o recuo quando se trabalha de forma interativa, mas no trabalho real é muito raro usar loops de forma interativa). Você pode usar uma lista genérica para fazer o loop em vários tipos diferentes de coisas: variáveis, valores, arquivos, subamostra, subíndices, Qualquer coisa que você possa descrever usando o texto. Se um elemento precisar conter espaços, coloque-o entre aspas. Looping sobre as variáveis ​​A coisa mais comum a seguir é variáveis. Por exemplo, suponha que você desejasse regredir diversas variáveis ​​dependentes nas mesmas variáveis ​​independentes. O seguinte código faz isso, usando o conjunto de dados de exemplo de automóvel que vem com Stata: sysuse auto foreach yvar em mpg deslocamento de preços reg yvar peso estrangeiro Looping em Partes de Nomes de Variáveis ​​Considere o seguinte conjunto de dados: Ele contém uma ficção (e não terrivelmente plausível ) Conjunto de dados de pessoas e seus rendimentos em doze meses. Este é um dado de painel na forma ampla, então há doze variáveis ​​de renda: incJan. IncFeb. IncMar. Etc. Suponha que você deseja criar um conjunto correspondente de variáveis ​​de indicadores para se a pessoa teve algum rendimento nesse mês. Criar um deles é direto: gen hadIncJan (incJangt0) se incJanlt. Mas criar todos os doze da mesma maneira seria tedioso. (Se você marcou, você achou que esse conjunto de dados não possui valores faltantes, excluindo-os deles, se não for estritamente necessário. Considere um lembrete para sempre pensar em valores faltantes ao criar essas variáveis ​​de indicadores.) Você pode criar tudo Doze variáveis ​​de indicadores de forma rápida e fácil com um loop foreach: foreach month in Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez geraIncmonth (incmonthgt0) if incontestável. Isso configura uma lista genérica contendo os meses e, em seguida, usa esses meses como partes de nomes de variáveis. Observe o processo que usamos para criar esse loop: primeiro descobrimos o comando wed use para um único elemento da lista e depois mudamos para usar macros. Este é um bom hábito sempre que você precisa escrever código não trivial envolvendo macros. Looping sobre Varlists Enquanto listas genéricas podem conter nomes de variáveis, você deve digitar todos os nomes individualmente. Se você disser a Stata que a lista que deseja encaminhar é uma lista de stata oficial, você pode usar atalhos de varlist padrão, como x para todas as variáveis ​​que começam com x e x-z para todas as variáveis ​​de x para z. Para revisar a sintaxe varlist, consulte a seção apropriada no Stata para pesquisadores. A sintaxe para um loop foreach em uma varlist é a seguinte: foreach macro of varlist vars Observe que, enquanto a sintaxe foreach para uma lista genérica contém. A sintaxe de uma lista estruturada tem. Stata usa o in ou of para determinar se a próxima palavra é o primeiro elemento da lista ou um tipo de lista. Os pesquisadores ocasionalmente recebem conjuntos de dados criados em outros programas onde os nomes das variáveis ​​estão em letras maiúsculas. Como Stata realmente se preocupa com o caso, os nomes das variáveis ​​em maiúsculas podem ser cansativos para trabalhar. Stata recentemente deu o comando renomear a capacidade de converter nomes para minúsculas: Mas este é um exemplo tão grande que permite fazê-lo com um loop foreach sobre um varlist de qualquer maneira: foreach oldname of varlist local newnamelower (quotoldnamequot) renomear oldname newname O asterisco () Tudo por si só corresponde a todas as variáveis, de modo que a lista que pretende encerrar contém todas as variáveis ​​no conjunto de dados atual. A função lower () leva uma string, neste caso, as tabelas da macro oldname. E converte-o em minúsculas. Observe o uso do sinal de igual no comando local que define o nome do usuário. De modo que menor (quotoldnamequot) é avaliado e o resultado é armazenado. Looping over Numbers Um loop forvalues ​​(freqüentemente abreviado forval) passa por números. Em vez de definir uma lista, você define um intervalo de números. De longe, o intervalo mais comum consiste em um número inicial e um número final, e a Stata assume que deve contar por aqueles entre eles. A sintaxe é simplesmente: forvalues ​​macro start end forvalues ​​i15 display i dá a saída: Se você precisa contar de uma maneira diferente, digite help forvalues ​​para ver mais opções. Considere o seguinte conjunto de dados: Este conjunto de dados é muito semelhante ao conjunto de dados dos rendimentos mensais que examinamos anteriormente, mas contém rendimentos anuais de 1990 a 2010. Sua tarefa é novamente criar um indicador para se uma pessoa teve algum rendimento em um Ano dado. Usando forvalues ​​isso é muito fácil de fazer: forvalues ​​year19902010 gen hadIncyear (incyeargt0) se incyearlt. Isso seria mais difícil se os anos não incluíssem o século (ou seja, 90 em vez de 1990) porque Stata pensa que 100 deve vir após 99 e não 00. Se seus dados incluem esses anos, considere adicionar o século antes de fazer algum trabalho sério com ele . Looping sobre valores e levelsf Às vezes, você precisa percorrer os valores que uma variável particular assume. Considere o seguinte conjunto de dados: contém dados sobre a categoria de raça, renda, idade e educação de um conjunto de pessoas de ficção. Suponha que você queira regredir renda em idade e educação. Mas acredito que os efeitos da idade e da educação podem ser diferentes para pessoas de diferentes raças. Uma abordagem (provavelmente não a melhor) seria executar uma regressão separada para as pessoas de cada raça. Normalmente, você poderia fazer isso com: por raça: regredir renda i. education (A construção i. education diz a Stata que a educação é um fator ou variável categórica e deve ser convertida em um conjunto de indicadores. Veja a seção sobre variáveis ​​de fatores em Stata Para os pesquisadores se você gostaria de analisar a sintaxe da variável do fator.) No entanto, trata-se de dados de pesquisa fictícia e você precisa corrigir o projeto da pesquisa em corrida de regressões. Se você não estiver familiarizado com os comandos do Statas, isso significa o seguinte: O projeto da pesquisa é descrito usando o comando svyset (conjunto de pesquisa). Este conjunto de dados tem unidades primárias de amostragem, dada pela variável psu e pesos de probabilidade dados pelo peso variável. O comando do svyset do comando correspondente (que já foi executado para que você não precise) é: svyset psu pweightweight Para ter o Stata correto para esses pesos nos comandos de estimativa, adicione o svy: prefix, por exemplo: svy: regress income income i. education Você não pode usar o padrão se a sintaxe com os dados da pesquisa ou os pesos não forem aplicados corretamente. Em vez disso, use a opção subpop () de svy. Por exemplo: svy, subpop (se race1): regride idade de renda i. education por: não pode ser usado com svy: o ponto 4 significa que você não pode executar sua regressão para todas as corridas usando. Mas você pode fazê-lo com um loop. Tudo por: faz é identificar os valores da raça e, em seguida, deslocá-los, e neste momento você sabe como fazer isso sozinho (embora seja: é mais rápido quando você pode usá-lo). A variável de corrida assume os valores um, dois e três, então um loop apropriado é: forvalues ​​race13 svy, subpop (se racerace): reg income age i. education E se você tivesse uma quarta corrida e seu número fosse nove (quotOtherquot ) Em vez de quatro Você poderia simplesmente recodificá-lo e torná-lo quatro. Mas se essa não é uma boa idéia para o seu projeto, você deve mudar para o loop de foreach menos estruturado: foreach race em 1 2 3 9 svy, subpop (se racerace): reg income age i. education Por outro lado, não é Incomum ter que fazer um loop em dezenas ou mesmo centenas de valores, ou não saber de antemão o que valores de uma variável assume. Nesse caso, você pode deixar o comando levelsf identificá-los para você e colocá-los em uma macro. A sintaxe é: levelsf variable. O nível local (macro) da raça, local (raças) irá listar todos os valores da variável raça e armazená-los em uma macro chamada raças. Você pode então deslocá-los com: foreach race em raças svy, subpop (se racerace): reg income age i. education No entanto, esta situação é bastante comum que a Stata escreveu um código especial para analisar macros em listas para looping. A sintaxe é: raça foreach de corridas locais svy, subpop (se racerace): reg income age i. education Observe que as corridas não estão nas cotações de macro usuais: o ponto inteiro dessa construção é ignorar o macro-processador regular em favor de Código é mais rápido no contexto de loops. Isso faz uma diferença muito pequena, mas se você fizer o suficiente, ela irá somar. Um recurso que você perdeu: é o texto na saída que lhe diz que, por grupo, está sendo trabalhado, mas você pode adicioná-lo você mesmo. A seguinte versão do loop adiciona um comando de exibição que insere duas linhas em branco e, em seguida, imprime o valor atual da macro da corrida antes de executar a regressão: foreach race of local races display newline (2) quotRaceracequot svy, subpop (if racerace): reg Idade do rendimento i. education O uso da exibição para imprimir o valor de uma macro em um determinado ponto do seu programa também é uma ferramenta muito útil para depuração. Tenha em mente que este foi apenas um exemplo. Uma maneira melhor de examinar o efeito da raça provavelmente seria interagir raça com as outras variáveis. A nova sintaxe para variáveis ​​de fatores e interações torna isso muito fácil: svy: regressar renda i. race (c. age i. education) Este modelo contém todos os modelos anteriores - se você é novo em regressões que incluem interações, descobrindo por que isso Pode ser um bom exercício. Loops aninhados Os comandos contidos em um loop podem incluir outros loops: Este código cria a seguinte saída: O loop interno (aquele que usa j) é executado três vezes, uma vez para cada valor de i. Assim, o comando de exibição executa um total de nove vezes. Observe como o comando de exibição está recuado duas vezes: uma vez que faz parte do loop i e uma vez porque faz parte do loop j. Quando você começa a trabalhar com loops aninhados é ainda mais importante que você pode facilmente dizer o que cada loop contém. Considere um conjunto de dados final: contém dados de renda mensais, mas para o período 1990-2010. Os nomes das variáveis ​​estão no formulário incJan1990. IncFeb1990. Etc. Para gerar um conjunto de indicadores correspondentes, você precisa seguir os meses e os anos: forval year19902010 foreach month in Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez ganhoIncmonthyear (incmonthyeargt0) se incmonthyearlt. Isso certamente é viável, mas um pouco complicado. Seria especialmente estranho se você estivesse interessado em atrasos, leads ou mudanças ao longo do tempo: você precisa de código para dizer a Stata que o mês antes de janeiro de 1991 é dezembro de 1990. Para a maioria dos propósitos, é mais fácil se os períodos de tempo forem simplesmente numerados sequencialmente. Neste caso, janeiro de 1990 seria o período 1, dezembro de 1990 seria o período 12 e janeiro de 1991, período 13. Felizmente, é bastante fácil de mudar: período local 1 ano forvaldo19902010 mês inicial em janeiro fev março abr maio junho jul ago setembro out novembro renome Incommonthyear incperiod renomear tinha Incmonthyear tinha Período de período local Incperiod1 O período de macro é usado como um contador. Ele começa definido para 1. e assim, à medida que os loops aninhados começam, incJan1990 é renomeado inc1 (e similarmente hadIncJan1990 a hadInc1). O período de percurso local do comando1 aumenta o período por um: uma vez que o macro-processador é feito com ele, o Stata apropriado vê o período local11. Isso completa o loop interno, então o mês é alterado para Feb. e incFeb1990 é renomeado para inc2. A macro de período é aumentada novamente (o Stata apropriado agora vê o período local21), o mês está definido para Mar. incMar1990 é renomeado para inc3. E assim por diante até que todos os 252 meses sejam convertidos. (Note-se que a inclusão de 1990 a 2010 é de 21 anos.) Ao fazer essa conversão, você perde a habilidade de olhar para uma variável e saber imediatamente o mês do calendário que descreve. Mas é muito mais fácil fazer um loop. Os loops aninhados podem ser substituídos por: A Importância das Convenções de Nomeação O nome da variável incJan1990 contém três componentes: a coisa observada (renda) e o mês e ano em que é observado. Os loops que escrevemos dependem dos nomes das variáveis ​​que descrevem os três de forma consistente: eles falhariam se o conjunto de dados contiveram jj1990 juntamente com o rendimentoJan1991. Incjan1992. Inclusive em 01993 ou incJan94. No mundo real, tais coisas não são incomuns. Os conjuntos de dados de pesquisas são um desafio particular porque seus nomes de variáveis ​​geralmente vêm da forma do questionário e não as informações que eles contêm. Aproveitar o tempo para renomear suas variáveis ​​de uma maneira que faz sentido para você é uma boa idéia no início de qualquer projeto, mas se você estiver usando loops é vital que você crie e aplique uma convenção de nomenclatura consistente para variáveis. Aproveite os States Automatic Loops Agora que você aprendeu a usar loops, pode ser tentador usá-los para tudo. Tenha em mente que a maioria dos comandos do Stata já são loops (faça algo para observar um, então faça isso para a observação dois, etc.) e esses loops são muito mais rápidos do que qualquer loop foreach ou forvalues. Por exemplo, os seguintes usos para valores de loop sobre todas as observações no conjunto de dados e definir o valor de y para cada observação para o valor de x para essa observação: gen y. Para valores i1N substituir yxi se ni, mas você obterá exatamente o mesmo resultado muito mais rápido e facilmente com: Ocasionalmente, alguém encontra uma tarefa que realmente exige um loop explícito sobre as observações, mas é raro. A programação inteligente pode, por vezes, transformar outros loops no loop padrão sobre as observações, tornando desnecessário o valor desejado. Por exemplo, a remodelação dos dados do painel de forma ampla em uma forma longa eliminará a necessidade de muitos loops. Volte para os 12 meses originais de dados de renda: Lembre-se de que criamos hadInc variáveis ​​de indicadores com o seguinte ciclo: foreach month in Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez gen teve Incmonth (incmonthgt0) if incongthlt. No entanto, você obterá os mesmos resultados com o seguinte: remodelar long inc, i (id) j (mês) string gen hadInc (incgt0) if inclt. Reshape wide inc hadInc, i (id) j (mês) string (Pegue um momento para examinar os dados após cada etapa.) Reformar um grande conjunto de dados é demorado, então não troque entre a forma ampla e a forma longa levemente. Mas se você pode identificar um bloco de coisas que você precisa fazer, isso seria mais fácil de fazer em uma forma longa, pode valer a pena remodelar no início e no final desse bloco. Última revisão: 2272017 Ferramentas de programação de dados Este artigo irá apresentá-lo a muitas ferramentas de programação da Stata que não são necessárias para todos, mas são muito úteis em determinadas circunstâncias. O público-alvo são os veteranos da Stata que já estão familiarizados e confortáveis ​​usando a sintaxe Stata e ferramentas de programação fundamentais, como macros, foreach e forvalues. Se você é novo para a Stata, nosso Stata para pesquisadores irá ensinar-lhe sintaxe básica do Stata, e a Stata Programming Essentials irá ensinar-lhe as ferramentas de programação fundamentais. Ao contrário deste artigo, eles não assumem nenhuma experiência de programação em Stata ou em geral. Os tópicos discutidos neste artigo incluem: Se você precisa aprender sobre um tópico específico, sinta-se à vontade para ignorar. Alguns dos exemplos utilizam material coberto anteriormente (ou seja, um programa que contém uma ramificação se), mas as explicações são autônomas. Cotações duplas compostas O início e o final de uma string são normalmente denotados por aspas duplas (quotstringquot). Isso causa problemas quando a própria string contém aspas duplas. Por exemplo, se você quisesse exibir a string Hamlet disse quotTo seja ou não seja. quot você não poderia usar o código: exibir quotHamlet disse quotTo ser ou não ser. quotquot A solução é o que Stata chama de duplas taxas duplas. Quando Stata vê quot (citação solitária esquerda seguida de uma cotação dupla), trata o que segue como uma string até que ele veja quot (citações duplas seguidas por uma citação única direita). Assim: exibir quotHamlet disse quotTo ser, ou não ser. quotquot. Na ocasião, você pode esperar que um comando gere um erro em determinadas circunstâncias, mas escolha ignorá-lo. Por exemplo, colocar log fechar no início de um arquivo do arquivo impede que um registro aberto anteriormente interfira com seu arquivo do, mas gera um erro se nenhum registro estiver aberto - mesmo que não haja um registro aberto é exatamente a situação que deseja crio. O prefixo de captura impede o Stata de interromper seu arquivo do do se o comando resultante gerar um erro. O primeiro erro é quotcapturedquot. Assim: o log de captura fechar irá fechar qualquer log aberto, mas não falhar um arquivo do do se nenhum arquivo de log estiver aberto. O prefixo de captura só deve ser usado quando você entender completamente o erro que o comando às vezes gera e por que ele faz isso - e você está muito confiante de que esse erro pode ser ignorado. Quando um comando é concluído, ele armazena um quotreturn codequot em rc. Um código de retorno de zero geralmente significa que o comando foi executado com sucesso. Você pode usar a captura seguida de uma ramificação se estiver baseada no código de retorno para que o Stata faça coisas diferentes, dependendo se um erro ocorreu ou não. Variáveis ​​em Contextos Escalares Uma variável Stata é um vetor: tem muitos valores. Se você digitar lista x você obtém uma lista de todos os valores de x. No entanto, alguns contextos exigem um escalar. Por exemplo, o comando de exibição exibe apenas uma coisa. Se uma variável é usada em um contexto escalar, o valor da variável para a primeira observação é usado. Assim, se você digitar: você obterá apenas o primeiro valor de x, como se você tivesse digitado: Sugerimos que não aproveitamos esse comportamento, porque isso faz com que o código seja confuso. Se um comando exige um escalar e você deseja que o escalar seja o primeiro valor de x. Digite x1 em vez de apenas x. Esse comportamento pode causar problemas reais se você não perceber que um contexto particular exige um escalar, como você verá na seção sobre ramificação se. Macros avançadas Esta seção irá discutir muitos truques que você pode usar para definir macros. Digite ajuda local para ainda mais. Armazenando listas de valores com levelsf O comando levelsof lista os valores válidos de uma variável e as armazena em uma macro local. A sintaxe é: levelsf variable. Local (macro) É freqüentemente usado com uma condição if para armazenar os valores de uma variável que aparecem em uma subamostra dada. O exemplo a seguir (tirado da Stata Programming Essentials) usa levelsf e um loop foreach para executar uma regressão ponderada por pesquisa separadamente para cada raça. Isso recria a funcionalidade por: mesmo que: não possa ser usado com svy: levelsf race, local (races) foreach race of local races display newline (2) quotRaceracequot svy, subpop (se racerace): reg income age i. education Desde Levelsf não inclui valores faltantes em sua lista, o código acima não executará uma regressão para observações com um valor faltando para raça. Isso é diferente. Que trata as observações com um valor faltante da variável como apenas outro grupo para atuar. Suponha que você tenha solicitado aos indivíduos que alistam os grupos sociais de que pertencem. Os grupos são codificados como números e armazenados nas variáveis ​​grupo i, onde i é um número inteiro. Assim, se uma pessoa dissesse que ela pertencia ao grupo cinco e ao grupo três (naquela ordem), seu valor do grupo1 seria 5 e seu valor do grupo2 seria 3. (Se ela listar menos grupos do que o número máximo permitido, ela faltará Valores para algumas variáveis ​​do grupo i). Você quer então criar uma variável de indicador para cada grupo que tenha um valor de 1 se a pessoa disser que ela é um membro desse grupo e zero de outra forma: foreach groupvar de varlist group levelsf groupvar, local ( Grupos) foreach grupo de grupos locais capture gen memgroup0 substituir memgroup1 se groupvargroup Este loops sobre as variáveis ​​do grupo i, descobre quais grupos foram listados em cada um deles, oscila sobre eles, cria uma variável de indicador para cada grupo e define o indicador como 1 Se a pessoa listou esse grupo. Observe que você não precisa saber de antemão quantos grupos uma pessoa pode listar ou os números dos grupos que podem aparecer. O comando gen tem captura na frente dela porque o indicador para um determinado grupo pode já ter sido criado: se alguém listou o grupo 5 como seu primeiro grupo e outra pessoa listada no grupo 5 como seu segundo grupo, o mem5 será criado ao processar o grupo1 e Tentando criar mem5 novamente quando o processo group2 dá um erro - mas você sabe que é um erro que você pode ignorar. Expandindo listas de variáveis ​​com unab O comando unab quotunabbreviatesquot a varlist (quotexpandquot foi tirado) e coloca os resultados em uma macro. A sintaxe é: macro unab. Varlist Por exemplo, se você tivesse variáveis ​​x1. X2 e x3. Então: criaria uma macro local chamada vars e colocaria nele x1 x2 x3. Isso pode ser útil para comandos que exigem uma lista de variáveis, mas não podem usar a sintaxe de varlist, como remodelar ao passar de longo a grande. Listas de arquivos Você pode colocar uma lista de arquivos em uma macro enviando local a saída de um comando dir. A sintaxe é: macroname local. Diretório Diretório quot pattern eles devem corresponder quot Aqui macroname é o nome da macro que deseja criar, o diretório é o diretório onde os arquivos estão localizados eo padrão que devem corresponder é algo como quotquot para todos os arquivos ou quot. dtaquot para todos os Stata Conjuntos de dados. Por exemplo, o seguinte colocaria uma lista de todos os conjuntos de dados Stata no diretório de trabalho atual em uma macro chamada datafiles: datafiles locais: dir. Files quot. dtaquot Uma complicação é que os nomes dos arquivos são colocados entre aspas (para que ele possa lidar com nomes de arquivos com espaços neles). Assim, para exibi-los, é necessário usar aspas duplas: No entanto, isso não causa problemas se você quiser encaminhar a lista de arquivos: arquivo foreach de arquivos de dados locais use o arquivo, limpe o que faz com o arquivo Formatando o Conteúdo de uma Macro Você Pode aplicar um formato a um número antes de armazená-lo em uma macro enviando local a saída de um comando de exibição que inclui um formato. Por exemplo, o seguinte comando armazena o R-quadrado da regressão de corrida mais recente, e (r2). Em uma macro chamada r2. Mas usando o formato 5.4f por isso tem quatro dígitos em vez de dezesseis. R2 local: exibir 5.4f e (r2) Incrementar e decodificar macros As macros freqüentemente precisam ser aumentadas em uma e menos freqüentemente diminuídas em uma. Você pode fazer isso com as operadoras e -. Estes vão dentro das citações de macro antes ou depois do nome da macro. Se eles forem colocados antes, a macro é incrementada (ou diminuída) e depois o resultado colocado no comando. Se eles são colocados depois, o valor atual da macro é colocado no comando e, em seguida, a macro é incrementada (ou diminuída). Experimente o seguinte: local x 1 exibição x exibição x-- exibição x Você pode usar os operadores de incremento ou decremento em um comando local para alterar uma macro sem fazer nada mais, mas certifique-se de colocar o operador antes do nome das macros. For example the following does not increase x : The macro processor replaces the macro x with 1. It then increases x to 2. but then when Stata proper executes the command it sees local x 1 and sets x back to 1. The following does increase x : Branching If Youre familiar with if conditions at the end of commands, meaning quotonly carry out this command for the observations where this condition is true. quot This is a subsetting if . When if starts a command, it is a branching if and has a very different meaning: quotdont execute the following command or commands at all unless this condition is true. quot The syntax is for a single command is: if condition command For a block of commands, its: if condition commands An if block can be followed by an else block, meaning quotcommands to be executed if the condition is not true. quot The else can precede another if. allowing for else if chains of any length: if condition1 commands to execute if condition1 is true else if condition2 commands to execute if condition one is false and condition2 is true else commands to execute if both condition1 and condition2 are false Consider trying to demean a list of variables, where the list is contained in a macro called varlist which was generated elsewhere and could contain string variables: foreach var of local varlist capture confirm numeric variable var if rc0 sum var, meanonly replace varvar-r(mean) else display as error quotvar is not a numeric variable and cannot be demeaned. quot The command confirm numeric variable var checks that var is a numeric variable, but when preceded by capture it does not crash the program if the variable is a string. Instead, if rc0 The condition for a branching if is only evaluated once, so a branching if is a scalar context and the rule that only the first value of a variable will be used applies. In particular, a branching if cannot be used for subsetting. Imagine a data set made up of observations from multiple census years where the data from 1960 is coded in a different way and thus has to be handled differently. What you should not write is something like: if year1960 code for handling observations from 1960 else code for handling observations from other year s Since this is a scalar context, the condition year1960 is only evaluated once, and the only value of year Stata will look at is that of the first observation. Thus if the first observation happens to be from 1960, the entire data set will be coded as if it came from 1960. If not, the entire data set will be coded as if it came from other years. This is not a job for branching if . it is a job for a standard subsetting if at the end of each command. The above code might make sense if it were embedded in a loop that processed multiple data sets, where each data set came from a single year. Then year would be the same for all the observations in a given data set, and the first observation could stand in for all of them. But in that case wed suggest writing something like: if year11960 Conditions for branching if frequently involve macros. If the macros contain text rather than numbers, the values on both sides of the equals sign need to be placed in quotes: foreach school in West East Memorial if quotschoolquotquotWestquot commands that should only be carried out for West High School commands that should be carried out for all schools While Loops foreach and forvalues loops repeat a block of commands a set number of times, but while loops repeat them until a given condition is no longer true. For example: local i 1 while ilt5 display i is equivalent to: forval i15 display i Note that i is increased by 1 each time through the while loop--if you left out that step the loop would never end. The following code is a more typical use of while: local xnew 1 local xold 0 local iteration 1 while abs(xnew-xold)gt.001 amp iterationlt100 local xold xnew local xnewxold-(3-xold3)(-3xold2) display quotIteration: iteration, x: xnewquot The above uses the Newton-Raphson method to solve the equation 3-x30. The algorithm proceeds until the result from the current iteration differs from that of the last iteration by less than .001, or it completes 100 iterations. The second condition acts as a failsafe in case the algorithm does not converge. Note that the initial value of xold is not used, but if it were the same as the initial value of xnew then the while condition would be false immediately and the loop would never be executed. A Stata program is a block of code which can be executed at any time by invoking the programs name. They are useful when you need to perform a task repeatedly, but not all at once. To begin defining a program, type: program define name where name is replaced by the name of the program to be defined. Subsequent commands are considered part of the program, until you type Thus a basic quotHello Worldquot program is: program define hello display quotHello Worldquot end To run this program, type hello . A program cannot be modified after it is defined to change it you must first drop the existing version with program drop and then define it again. Since a do file run in an interactive session cant be sure whats been defined previously, its best to capture program drop a program before you define it: capture program drop hello program define hello display quotHello World Againquot end Programs can be controlled by passing in arguments . An argument can be anything you can put in a macro: numbers, text, names of variables, etc. You pass arguments into a program by typing them after its program name. Thus: hello Russell Dimond runs the hello program with two arguments: Russell and Dimond. But arguments only matter if the program does something with them--the current version of hello will completely ignore them. Programs that use arguments should first use the args command to assign them to local macros. The command: args fname lname puts the first argument the program received in the macro fname and the second in the macro lname. You can then use those macros in subsequent commands: capture program drop hello program define hello args fname lname display quotHello fname lname quot end If you then type: hello Russell Dimond the output will be: Hello Russell Dimond Of course if you type: hello Dimond Russell the output will be: Hello Dimond Russell Its up to you to make sure the arguments you pass in match what the program is expecting. The macro 0 is always defined, and contains a list of all the arguments that were passed into the program. This is useful for handling lists of unknown length. For example, you could take the code you wrote earlier for demeaning lists of variables and turn it into a program: program define demean foreach var of local 0 capture confirm numeric variable var if rc0 sum var, meanonly replace varvar-r(mean) else display as error quotvar is not a numeric variable and cannot be demeaned. quot end To run this program, youd type demean and then a list of variables to be demeaned: You might also want to look at the syntax command, which makes it relatively easy to write a program that understands standard Stata syntax, but syntax is beyond the scope of this article. Returning Values Your program can return values in the r() or e() vectors, just like official Stata commands. This is critical if your program is intended for use with bootstrap or simulate. To do so, first declare in your program define command that the program is either rclass (puts results in the r() vector) or eclass (puts results in the e() vector): program define myprogram, rclass When you have a result to return, use the return command. The general syntax is: return type name value where type can be scalar. local or matrix. value is what you want to return, and name is what you want it to be called. As a trivial example: return scalar x3 When the program is complete, you can refer to the result as r( name ) or e( name ). Thus if youve just run a program containing the above return command, typing: creates a variable var with the value 3 . For a more realistic example, see the last section of Bootstrapping in Stata . Last Revised: 12142010

Comments