如何编辑 predict.lm() 使用的模型矩阵中的交互作用?

玉米旗布

我想编辑 R 中 predict.lm() 使用的模型矩阵来预测主效应而不是交互作用(但使用包含交互作用的完整模型的系数和方差)。

我试过了:

data(npk) #example data
mod <- lm(yield ~ N*P*K, data=npk, x=T) #run model
newmat <- mod$x # acquire model matrix
newmat[, c(5:8)] <- 0 #set interaction terms to 0
#try to predict on the new matrix..
predict(mod, as.data.frame(newmat), type="response", interval="confidence") 

...但这会返回错误,'data' must be a data.frame, not a matrix or an array因为 predict.lm() 不接受模型矩阵。

如何使用示例代码中给出的模型矩阵进行预测?

(或者是否有更好的方法来预测主效应而不是相互作用,使用完整模型yield ~ N*P*K?

周杰伦

我们可以手工计算交互作用;通过首先创建术语trms,然后以一种eval(parse())方法评估它们,可以轻松完成

## create interaction terms 
iv <- c('N', 'P', 'K')  ## indp. vars
trms <- unlist(sapply(2:3, function(m) combn(iv, m, FUN=paste, collapse='x')))
## evaluate them to a matrix
Ia <- with(npk1, sapply(trms, function(x) eval(parse(text=gsub('x', '*', x)))))

然后只需 cbind 并在 中使用它lm(),比较:

## cbind
npk2 <- cbind(npk1, Ia)
## following yield the same:
(mod1 <- lm(yield ~ .^3, data=npk1))
(mod2 <- lm(yield ~ ., data=npk2, x=TRUE))

那么你可以按照你的方法:

newmat <- mod2$x  ## acquire model matrix
newmat[, c(5:8)] <- 0  ## set interaction terms to 0
predict(mod2, newdata=as.data.frame(newmat))  ## newdata w/ Ia to zero
# 1        2        3        4        5        6        7        8        9       10 
# 54.90000 66.66667 51.43333 64.33333 63.76667 67.23333 52.00000 54.33333 54.33333 67.23333 
# 11       12       13       14       15       16       17       18       19       20 
# 63.76667 52.00000 63.76667 67.23333 52.00000 54.33333 66.66667 51.43333 64.33333 54.90000 
# 21       22       23       24 
# 64.33333 66.66667 54.90000 51.43333 

然而:

predict(mod1)  ## old model
# 1        2        3        4        5        6        7        8        9       10 
# 50.50000 57.93333 51.43333 54.66667 63.76667 54.36667 52.00000 54.33333 54.33333 54.36667 
# 11       12       13       14       15       16       17       18       19       20 
# 63.76667 52.00000 63.76667 54.36667 52.00000 54.33333 57.93333 51.43333 54.66667 50.50000 
# 21       22       23       24 
# 54.66667 57.93333 50.50000 51.43333 
    

数据:

npk1 <- structure(list(N = c(0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 
0, 0, 1, 0, 1, 0, 1, 1, 0, 0), P = c(1, 1, 0, 0, 0, 1, 0, 1, 
1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0), K = c(1, 0, 
0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 
0), yield = c(49.5, 62.8, 46.8, 57, 59.8, 58.5, 55.5, 56, 62.8, 
55.8, 69.5, 55, 62, 48.8, 45.5, 44.2, 52, 51.5, 49.8, 48.8, 57.2, 
59, 53.2, 56)), row.names = c(NA, 24L), class = "data.frame")

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Spock中,如何从“ then”块中消除重复的交互作用?

glmer logit-交互作用对概率标度的影响(将“ effects”复制为“ predict”)

如何从lm结果中获取RMSE?

lm()和predict.lm()的异常行为取决于显式命名空间访问器的使用

`predict.lm`函数中的参数

在管道中将dplyr中的group_by()与predict.lm和do()一起使用以进行年度线性外推

从predict.lm()匹配R的置信区间

如何在自己的函数中在lm中使用vars?

在R中使用基于具有不同对比度的model.matrix的predict.lm

如何在lm模型的summary()中放入循环?

如何在R中的lm()函数中使用变量?

如何在数据集列表上运行lm模型?

如何使用交叉验证输出中的最佳模型使用keras model.predict()?

给定B1的值如何使用Predict()线性模型

如何在“随机森林分类器”中获取“ predict”预测的类的“ predict_proba”?

如何从表中的lm()获取摘要?

如何对大量属性使用lm函数

R中的predict.lm错误:因子as.factor(每天)具有新的级别2

如何用NA代替R中lm模型的未知因素?

使用lm()和predict()进行滚动回归和预测

如何在R中的回归中编写交互作用?

是否有lm(。〜x,data)?我如何在lm公式中运行很多

用置信区间绘制 predict.lm 结果

如何使用 R 中的 Tidymodels 计算 LM 的重要性?

如何正确使用 clf.predict_proba?

R predict() 要求排除在 lm() 回归模型中的变量

我正在尝试基于使用 predict.lm() 的回归来预测新值,但结果显示新值的数量错误

为什么我在 predict.lm “可变长度不同”中遇到错误?

如何在 R ggplot2 中拟合具有交互作用的混合效应模型回归?