从拟合线性模型中提取独立变量相互作用的均值

Extract mean of independent variable interaction from fitted linear model

我尝试从装有 lm().

的模型中获取两个变量的乘积(相互作用)的平均值
N <- 1000
u <- rnorm(N)
x1 <- rnorm(N)
x2 <- 1 + x1 + rnorm(N)
y <- 1 + x1 + x2 + u
df <- data.frame(y,x1,x2)
fit <- lm(y ~ x1 * x2, data = df)

我可以计算访问 $model.

的系数的单个变量的均值
mean(fit$model[,2])
# verify result
mean(df[,2])

但是我如何在不返回数据的情况下获得交互的平均值。

# Result should be
mean(df$x1*df$x2)
mean(x1 * x2)
#[1] 0.9009494

mean(do.call("*", fit$model[, c("x1", "x2")]))
#[1] 0.9009494

fit <- lm(y ~ x1 * x2, data = df, x=TRUE)
mean(fit$x[,"x1:x2"])
#[1] 0.9009494

我不确定 为什么 你想要这个,但是从 fit 得到它是微不足道的。首先,最好不要用 $ 去钻研像这样的拟合对象。相反,学习使用提取器函数。在这种情况下,mean(fit$model[,2]) 的等价物是,对于数据的所有列一次:

> colMeans(model.frame(fit))
        y        x1        x2 
2.0783225 0.0283555 1.0481141

模型框架只是数据的一个副本。你想要的是设计矩阵,或者 R 称之为模型矩阵,不出所料,它是使用 model.matrix() 函数获得的。

> head(model.matrix(fit))
  (Intercept)          x1          x2       x1:x2
1           1 -0.33406119  1.95054087 -0.65160001
2           1 -1.41848058  0.35429591 -0.50256186
3           1 -1.32877702 -0.00783884  0.01041607
4           1  0.54054637  1.34637056  0.72777572
5           1 -0.75686319 -0.36476471  0.27607699
6           1  0.04514449  1.62928315  0.07355316

请注意,响应数据不在设计矩阵中,但交互项在最后一列中。再次使用colMeans()得到这个设计矩阵每一列的平均值:

> colMeans(model.matrix(fit))
(Intercept)          x1          x2       x1:x2 
  1.0000000   0.0283555   1.0481141   1.0820110

为了完整起见,我应该证明这对我的随机数据集是正确的:

> colMeans(transform(df[,-1], interaction = x1 * x2))
         x1          x2 interaction 
  0.0283555   1.0481141   1.0820110