2017-04-01 23 views
2

standardize()arm包因为我使用as.formula定义formula对象并在lm(formula, data = df)中使用它而失败。为什么arm :: standardize()无法在循环中的lm对象上工作?

选项A(我不想)将lm以外的输入标准化。选项B尝试(并失败)来标准化lm对象。

(注意:保持我的循环结构,因为我的实际使用情况是一个比较复杂一点)

# create data 
    library(arm) 
    set.seed(324) 
    df <- data.frame(y=sample(0:50, 100, replace=T), 
        x1=sample(0:1, 100, replace=T), 
        x2=sample(0:50, 100, replace=T)) 

# rescale outside of lm for comparison 
    df$x1Z <- rescale(df$x1, binary.inputs = "0/1") 
    df$x2Z <- rescale(df$x2, binary.inputs = "0/1") 

# actual use case has more vars 
    var <- c("x1", "x2") 
    varZ <- c("x1Z", "x2Z") 

# Option A: lm on rescaled 
    a <- data.frame(matrix(NA, nrow = 0, ncol = 6)) 
    for (i in 1:length(var)) { 
    formula <- as.formula(paste("y ~", varZ[i])) # use standardized 
    m1 <- lm(formula, data = df) 
    ms1 <- summary(m1) 
    a[i, 1] <- var[i] 
    a[i, 2] <- coefficients(ms1)[1,1] 
    a[i, 3] <- coefficients(ms1)[2,1] 
    a[i, 4] <- coefficients(ms1)[2,4] 
    a[i, 5] <- confint(m1)[2,1]   
    a[i, 6] <- confint(m1)[2,2]   
    } 
    names(a) <- c("predictor", "intercept", "est", "p", "L95CI", "U95CI") 

# Option B: lm, rescaling within lm 
    b <- data.frame(matrix(NA, nrow = 0, ncol = 6)) 
    for (i in 1:length(var)) { 
    formula <- as.formula(paste("y ~", var[i])) # use raw 
    m2 <- lm(formula, data = df) 
    m2Z <- standardize(m2, binary.inputs="0/1") # error 
    ms2 <- summary(m2Z) 
    b[i, 1] <- var[i] 
    b[i, 2] <- coefficients(ms2)[1,1] 
    b[i, 3] <- coefficients(ms2)[2,1] 
    b[i, 4] <- coefficients(ms2)[2,4] 
    b[i, 5] <- confint(m2)[2,1]   
    b[i, 6] <- confint(m2)[2,2]   
    } 
    names(b) <- c("predictor", "intercept", "est", "p", "L95CI", "U95CI") 

只是为了显示standardize作品:

m3 <- lm(y ~ x2, data=df) 
standardize(m3, binary.inputs="0/1") 

回答

2

使用

m2 <- do.call("lm", list(formula = formula, data = quote(df))) 

在选择B的循环中。

你的问题或多或少类似于这个:Showing string in formula and not as variable in lm fit。你想保留一个体面的公式在m2$call

如果你想知道为什么这是很重要的,看到的standardize源代码:

getMethod("standardize", "lm") 

此功能通过提取和分析的lm对象的$call

相关问题