如何从coef / model.matrix手动获取线性模型

时间:2015-07-15 00:38:32

标签: r

我在如何从模型系数和模型矩阵中找出预测值时遇到了很多麻烦。我希望有人可以提供帮助。

我目前有一个线性模型,我正在设置两个自变量。 e.g。

data <- data.frame(d1,d2,d3)
lm.data <- lm(d1~d2*d3,data)

我现在可以得到系数向量

co.data <- coef(lm.data)

我现在也可以轻松获得模型矩阵

mm.data <- model.matrix(lm.data)

这是我可以丢失的地方!我正在努力教会自己如何在将predict(lm.data)与系数一起使用时匹配我可以使用的值。换句话说,我知道从设计矩阵和系数的模型的预测值可以计算,但在过去48小时的工作,我真的不知道。

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:12)

您只需要了解线性模型的工作原理。 如果您的公式为d1 ~ d2 * d3并且它们全部为数字,那么预测您只需执行(intercept) + (d2 coefficient)*x_d2 + (d3 coefficient)*x_d3 + (d2:d3 coefficient)*x_d2*x_d3,这将为您提供预测的d1

这是一个可重复的例子:

data(iris)
m <- lm(Sepal.Length ~ Petal.Length * Sepal.Width, iris)
co.data <- coef(m)

# we'll predict the sepal length for these petal lengths and sepal widths:
x.pl <- runif(5, min=1, max=2)
x.sw <- runif(5, min=2, max=5)
y.predicted <-  predict(m, data.frame(Petal.Length=x.pl, Sepal.Width=x.sw)) 
#        1        2        3        4        5 
# 5.379006 5.495907 5.296913 4.382487 5.131850 

现在手动完成,让我们看一下系数:

co.data
# Intercept)             Petal.Length              Sepal.Width Petal.Length:Sepal.Width 
# 1.40438275               0.71845958               0.84995691              -0.07701327 

根据上面的公式:

y <- co.data[1] + co.data[2]*x.pl + co.data[3] * x.sw + co.data[4]*x.pl*x.sw
# [1] 5.379006 5.495907 5.296913 4.382487 5.131850

不是手动编写,而是可以执行以下操作:

# x is a matrix with columns 1, petal length, sepal width, pl*sw
# (matches order of co.data)
x <- cbind(1, matrix(c(x.pl, x.sw, x.pl*x.sw), ncol=3))
x %*% co.data
#          [,1]
# [1,] 5.379006
# [2,] 5.495907
# [3,] 5.296913
# [4,] 4.382487
# [5,] 5.131850