Reputation: 11707
I've been looking for an equivalent to a well-known pattern in Stata for looping processes like linear regressions. Here is an example from Dehejia and Wahba (1999)
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') "
}
}
}'
I don't need the entire structure re-created, but would like to know if there is an R analogue to this feature:
reg re78 treat `spec`t''
Here, Stata is running a linear regression with a programatically inter-changeable set of co-variates within the for loop using 't.' How do I replicate something like this in R? I tried something like this:
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)
}
But to no avail for obvious reasons.
Upvotes: 0
Views: 73
Reputation: 4846
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))
}
Upvotes: 1