在公式中更改变量的名称

3
我正在尝试创建通用函数以处理具有多个可信值的数据框。我想要的是将公式传递给函数以执行回归,例如:
f <- MRPCM ~ DSEX + IEP + ELL3 + SDRACEM + PARED
在数据框中实际上不存在MRPCM变量。相反,存在五个变量,即MRPCM1、MRPCM2、MRPCM3、MRPCM4和MRPCM5。我想做的是迭代并更新公式(这里是f)以创建五个公式。这可以完成吗?update.formula函数似乎只能一次在整个左侧或右侧上工作。我还应该指出,在此示例中,我希望更改的变量是因变量,因此update(f, MRPCM1 ~ .)有效。但是,我不知道变量在公式中出现的位置。
例如:
f <- MRPCM + DSEX ~ IEP + ELL3 + SDRACEM + PARED update.formula(f, as.formula('MRPCM1 ~ .'))
结果如下(请注意,DSEX现在已经消失了):
MRPCM1 ~ IEP + ELL3 + SDRACEM + PARED

合理的变量名从哪里来? - Chase
1
此外,可以查看 ?as.formula 下的示例,将字符串粘贴在一起并将其转换为公式。理论上,这可能会实现您想要的效果 - 让您的问题变得可重现,我们将确保它是否有效。 - Chase
1个回答

6
这里展示一个方法的演示。更高级的实现可能会更新已拟合的线性模型(详见?update),但这超出了你问题的直接范围。
## Make a reproducible example!!
df <- 
setNames(as.data.frame(matrix(rnorm(96), ncol=8)), 
         c("MRPCM1","MRPCM2","MRPCM3","DSEX","IEP", "ELL3","SDRACEM","PARED"))

## Construct a template formula
f <- MRPCM ~ DSEX + IEP + ELL3 + SDRACEM + PARED

## Workhorse function
iterlm <- function(formula, data) {
    ## Find columns in data matching pattern on left hand side of formula
    LHSpat <- deparse(formula[[2]])
    LHSvars <- grep(LHSpat, names(data), value = TRUE)
    ## Run through matchded columns, repeatedly updating the formula,
    ## fitting linear model, and extracting whatever results you want. 
    sapply(LHSvars, FUN=function(var) {
        uf <- update.formula(f, as.formula(paste(var, "~ .")))
        coef(lm(uf, df))
    })
}

## Try it
iterlm(f, df)
##                  MRPCM1     MRPCM2      MRPCM3
## (Intercept)  0.71638942 -0.3883355  0.22202700
## DSEX        -0.07048994 -0.7478064  0.62590580
## IEP         -0.22716821 -0.2381982  0.12205780
## ELL3        -0.44492392  0.1720344  0.41251561
## SDRACEM      0.21629235  0.4800773  0.02866802
## PARED        0.07885683 -0.2582598 -0.07996121

谢谢Josh,这几乎是正确的。如果有多个变量需要替换,则此方法无法正常工作。请参见上面对原问题的编辑。 - jbryer
@jbryer -- 好吧,现在这已经成为了一个不同的问题,我会以不同的方式来处理它。我不会为此工作,但是这里有一些进一步的提示供您尝试。(1) 在iterlm()的第一行中放置一个browser()调用。然后尝试使用具有多个变量的公式测试iterlm()。(2) 尝试f[[2]][[2]]f[[2]][[2]] <- as.symbol("randomString"),以查看如何修改公式中的第一个变量。(3) 尝试一个if(length(f[[2]]) > 1) {}结构,以了解如何编写一个处理具有1个或多个变量的公式的函数。 - Josh O'Brien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接