2016-12-07 2 views
0

저는 선형 회귀와 같은 루핑 프로세스를위한 Stata의 잘 알려진 패턴에 해당하는 것을 찾고있었습니다. 여기 Dehejia 및 Wahba의 예입니다 (1999)Stata의 회귀 루프를 다시 만드는 가장 좋은 방법 R

local data "nswre74 cps1re74 cps3re74 " 
local datashort "cps1re74 cps3re74" 

local spec1 "" 
local spec2 "age age2 ed black hisp nodeg" 
local spec3 "re75" 
local spec4 "re75 age age2 ed black hisp nodeg" 
local spec5 "re74 re75 age age2 ed black hisp nodeg" 
local spec2a "age age2 ed black hisp nodeg married" 
local spec4a "re75 age age2 ed black hisp nodeg married" 
local spec5a "re74 re75 age age2 ed black hisp nodeg married" 

foreach set in `data' { 
    local lctr = 0 
    u `path'/`set', clear 
    forvalues t = 1/5 { 
     local ++lctr 
     reg re78 treat `spec`t'' 
      local b = _b[treat] 
      local se = _se[treat] 
      local b = round(`b',1) 
      local se = round(`se',1) 
      local line`lctr' "`line`lctr''& `b' & (`se') " 
     if `t' == 2 | `t' == 4 | `t' == 5 { 
      local ++lctr 
      reg re78 treat `spec`t'a' 
      local b = _b[treat] 
      local se = _se[treat] 
      local b = round(`b',1) 
      local se = round(`se',1) 
      local line`lctr' "`line`lctr''& `b' & (`se') " 
     } 
    } 
}' 

나는 전체 구조를 다시 만들 필요하지 않지만이 기능에 R 아날로그가 있는지 알고 싶습니다 :

reg re78 treat `spec`t'' 

여기에서 Stata는 't'를 사용하여 for 루프 내에서 프로그램 적으로 상호 교환 가능한 공변량 집합을 사용하여 선형 회귀를 실행합니다. R에서 이와 같은 것을 어떻게 복제합니까? 나는 이와 같은 것을 시도했다 :

spec1 <- "" 
spec2 <- "age+age2+ed+black+hisp+nodeg" 
spec3 <- "re75" 
spec4 <- "re75+age+age2+ed+black+hisp+nodeg" 
spec5 <-"re74+re75+age+age2+ed+black+hisp+nodeg" 
spec2a <- "age+age2+ed+black+hisp+nodeg+married" 
spec4a <- "re75+age+age2+ed+black+hisp+nodeg+married" 
spec5a <- "re74+re75+age+age2+ed+black+hisp+nodeg+married" 

for(i in 1:5){ 
fla <- as.formula(paste("y ~", as.formula(paste0("spec", as.character(i))), collapse="")) 
lm(fla, data = data) 
} 

그러나 분명한 이유 때문에 아무 소용이 없다.

+2

각 사양을 문자 벡터로 목록에 저장하십시오. 그런 다음 수식을 구성하기 위해'reformulate '을 사용하여 목록을 통해'lapply'합니다. 결과로 나온 회귀 모델은 쉽고 체계적인 액세스를 위해 목록에 저장됩니다. 원하는 경우 목록에 이름을 추가 한 다음'paste0'을 사용하여 Stata 메소드와 더 비슷한'for' 루프 (결과를 목록에 저장)에 나열 요소를 호출 할 수 있습니다. – lmo

답변

1
specs = list("1", 
       "age+age2+ed+black+hisp+nodeg", 
       "re75", 
       "re75+age+age2+ed+black+hisp+nodeg", 
       "re74+re75+age+age2+ed+black+hisp+nodeg", 
       "age+age2+ed+black+hisp+nodeg+married", 
       "re75+age+age2+ed+black+hisp+nodeg+married", 
       "re74+re75+age+age2+ed+black+hisp+nodeg+married" 
) 

for(each in specs){ 
    fla = as.formula(paste0("y ~", each)) 
    print(lm(fla, data = data)) 
} 
관련 문제