2017-04-01 24 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

相關問題