为什么 arm::standardize() 无法在循环中处理 lm 对象?
Why does arm::standardize() fail to work on a lm object in a loop?
当我使用 as.formula
定义 formula
对象并在 lm(formula, data = df)
.[=19 中使用它时,arm
包中的 standardize()
对我来说失败了=]
选项 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")
使用
m2 <- do.call("lm", list(formula = formula, data = quote(df)))
在选项 B 的循环中。
您的问题与此问题或多或少相似:。你想在 m2$call
.
中保留一个像样的公式
如果您想知道为什么这很重要,请参阅 standardize
的源代码:
getMethod("standardize", "lm")
此函数通过提取和分析 lm
对象的 $call
来工作。
as.formula
定义 formula
对象并在 lm(formula, data = df)
.[=19 中使用它时,arm
包中的 standardize()
对我来说失败了=]
选项 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")
使用
m2 <- do.call("lm", list(formula = formula, data = quote(df)))
在选项 B 的循环中。
您的问题与此问题或多或少相似:m2$call
.
如果您想知道为什么这很重要,请参阅 standardize
的源代码:
getMethod("standardize", "lm")
此函数通过提取和分析 lm
对象的 $call
来工作。