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

时间:2015-01-23 16:49:15

标签: r lm

我试图从符合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)

2 个答案:

答案 0 :(得分:1)

我不确定为什么你想要这个,但从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

答案 1 :(得分:0)

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