如何从coef/model.matrix手动获取线性模型上的predict()值

Sea*_*ean 2 r

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

我目前有一个线性模型,我正在设置两个独立的变量.例如

data <- data.frame(d1,d2,d3)
lm.data <- lm(d1~d2*d3,data)
Run Code Online (Sandbox Code Playgroud)

我现在可以得到系数向量

co.data <- coef(lm.data)
Run Code Online (Sandbox Code Playgroud)

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

mm.data <- model.matrix(lm.data)
Run Code Online (Sandbox Code Playgroud)

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

任何帮助都会很棒.

mat*_*fee 13

您只需要知道线性模型的工作原理.如果你的公式是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 
Run Code Online (Sandbox Code Playgroud)

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

co.data
# Intercept)             Petal.Length              Sepal.Width Petal.Length:Sepal.Width 
# 1.40438275               0.71845958               0.84995691              -0.07701327 
Run Code Online (Sandbox Code Playgroud)

根据上面的公式:

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
Run Code Online (Sandbox Code Playgroud)

而不是手动写出来,你可以做类似的事情:

# 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
Run Code Online (Sandbox Code Playgroud)