将 lm() 和 Predict() 应用于数据框中的多列

2024-01-10

我下面有一个示例数据集。

train<-data.frame(x1 = c(4,5,6,4,3,5), x2 = c(4,2,4,0,5,4), x3 = c(1,1,1,0,0,1),
                  x4 = c(1,0,1,1,0,0), x5 = c(0,0,0,1,1,1))

假设我想为列创建单独的模型x3, x4, x5基于列x1 and x2。例如

lm1 <- lm(x3 ~ x1 + x2)
lm2 <- lm(x4 ~ x1 + x2)
lm3 <- lm(x5 ~ x1 + x2) 

然后,我想采用这些模型并使用预测将它们应用到测试集,然后创建一个矩阵,将每个模型结果作为一列。

test <- data.frame(x1 = c(4,3,2,1,5,6), x2 = c(4,2,1,6,8,5))
p1 <- predict(lm1, newdata = test)
p2 <- predict(lm2, newdata = test)
p3 <- predict(lm3, newdata = test)
final <- cbind(p1, p2, p3)

这是一个简化版本,您可以一步步完成,实际数据太大了。有没有办法创建一个函数或使用 for 语句将其合并为一个或两个步骤?


我倾向于将您的问题作为重复项来结束拟合具有多个 LHS 的线性模型 https://stackoverflow.com/q/39262534/4891738,但遗憾的是预测问题在那里没有得到解决。另一方面,预测“mlm”线性模型对象lm() https://stackoverflow.com/q/39553770/4891738谈论预测,但与您的情况有点遥远,因为您使用公式接口而不是矩阵接口。

我没能找到完美的重复目标“传销”标签 https://stackoverflow.com/questions/tagged/mlm。所以我认为为这个标签提供另一个答案是个好主意。正如我在相关问题中所说,predict.mlm不支持se.fit,目前,这也是“mlm”标签中缺失的问题。所以我想借此机会来填补这个空白。


这是一个获取预测标准误差的函数:

f <- function (mlmObject, newdata) {
  ## model formula
  form <- formula(mlmObject)
  ## drop response (LHS)
  form[[2]] <- NULL
  ## prediction matrix
  X <- model.matrix(form, newdata)
  Q <- forwardsolve(t(qr.R(mlmObject$qr)), t(X))
  ## unscaled prediction standard error
  unscaled.se <- sqrt(colSums(Q ^ 2))
  ## residual standard error
  sigma <- sqrt(colSums(residuals(mlmObject) ^ 2) / mlmObject$df.residual)
  ## scaled prediction standard error
  tcrossprod(unscaled.se, sigma)
  }

对于你给定的例子,你可以这样做

## fit an `mlm`
fit <- lm(cbind(x3, x4, x5) ~ x1 + x2, data = train)

## prediction (mean only)
pred <- predict(fit, newdata = test)

#            x3          x4         x5
#1  0.555956679  0.38628159 0.60649819
#2  0.003610108  0.47653430 0.95848375
#3 -0.458483755  0.48014440 1.27256318
#4 -0.379061372 -0.03610108 1.35920578
#5  1.288808664  0.12274368 0.17870036
#6  1.389891697  0.46570397 0.01624549

## prediction error
pred.se <- f(fit, newdata = test)

#          [,1]      [,2]      [,3]
#[1,] 0.1974039 0.3321300 0.2976205
#[2,] 0.3254108 0.5475000 0.4906129
#[3,] 0.5071956 0.8533510 0.7646849
#[4,] 0.6583707 1.1077014 0.9926075
#[5,] 0.5049637 0.8495959 0.7613200
#[6,] 0.3552794 0.5977537 0.5356451

我们可以验证f是正确的:

## `lm1`, `lm2` and `lm3` are defined in your question
predict(lm1, test, se.fit = TRUE)$se.fit
#        1         2         3         4         5         6 
#0.1974039 0.3254108 0.5071956 0.6583707 0.5049637 0.3552794 

predict(lm2, test, se.fit = TRUE)$se.fit
#        1         2         3         4         5         6 
#0.3321300 0.5475000 0.8533510 1.1077014 0.8495959 0.5977537 

predict(lm3, test, se.fit = TRUE)$se.fit
#        1         2         3         4         5         6 
#0.2976205 0.4906129 0.7646849 0.9926075 0.7613200 0.5356451 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 lm() 和 Predict() 应用于数据框中的多列 的相关文章

随机推荐

  • 忘记是行不通的

    如果我尝试从此集合中删除某个项目 examples Example where example data example gt get 通过做 examples gt forget 20 它不会从集合中删除该项目 我仍然取回原来存在的所有项
  • 如何将自定义 Java 类转换为 Spark 数据集

    我无法找到将测试对象列表转换为 Spark 中的数据集的方法 这是我的课 public class Test public String a public String b public Test String a String b thi
  • Brave/Chrome 浏览器中图像周围出现不需要的边框半径角

    我尝试在容器内显示一个简单的图像border radius 5px 但角落处似乎有一个细边框的轮廓 您需要仔细查看下图 如何避免这些角边框 cover margin 1em padding 1em image wrapper height
  • 如何从 Android 删除 Firestore 集合

    Issue 我正在寻找一个临时解决方案来从客户端删除集合以进行概念证明 我最终将按照建议将其重构到服务器上 我添加了删除所有特定 Firestore 用户帐户信息的功能 包括他们在应用程序中保存的内容集合 根据Firestore 文档 ht
  • 标识符 int 不是 struct SOCKET_LOG_DATA 的直接成员

    当我编译以下结构时 typedef PACKED struct PACKED SUFFIX SOCKET LOG DATA typedef PACKED union PACKED SUFFIX PACKED struct PACKED SU
  • Swift 中的条件删除集合的最后一个元素

    我正在尝试删除 从字符串数组的后面直到最后一项包含一些文本 但我的实现没有实现 到目前为止我的实现 var array A B C D while true if array last array last array removeLast
  • Django i18n 不起作用

    我正在尝试为我的项目激活不同的语言 现在有英语和西班牙语 我将描述我遵循的所有步骤 首先 我将自己置于要翻译的目录中 或者更好地说 所有 trans 标签都是 cd media templates landing mkdir locale
  • Javascript e.preventDefault();不适用于提交()

    我在使用 javascript 提交表单时遇到问题submit 现场录制 https jsfiddle net 98sm3f3t https jsfiddle net 98sm3f3t HTML
  • 从 JPanel 中完全删除 JLabel...而不是 setVisible(False)

    我有一个相当简单的问题 我在 JFrame 上有一个 JPanel 我在 JPanel 上有一个 JLabel 我想知道如何在运行时从 JPanel 中完全删除 JLabel ImageIcon image7 new ImageIcon a
  • C++,DLL的多个实例,单例

    我有一个 DLL 其中定义了单例 我有一个可以加载此 DLL 的多个实例的应用程序 DLL 需要每个 DLL 实例有一个单例实例 否则会崩溃 我发现多个 DLL 实例只有一个单例实例 为什么 我怎样才能解决它 如果可能的话 不将单例重构为其
  • Linq orderby 文化(丹麦语、æøå)

    我的 orderby linq 表达式有问题 它以错误的顺序生成输出 我来自丹麦 正在创建一个丹麦网站 因此订单必须准确无误 这是我的查询 var model from w in db News orderby w Title select
  • 与列表相比,生成器多次迭代的速度

    我预计在多个循环的情况下列表迭代将比使用生成器快得多 而我的代码表明这是错误的 我的理解是 通过操作我指的是定义元素的任何表达式 一个清单需要n待初始化的操作 但列表上的每个循环只是从内存中获取一个元素 thus m循环列表只需要n运营 生
  • 如何添加 HTML 哈希链接而不改变 URL 栏...?

    当我将 HTML 链接添加到页面的特定部分时 a href specific test a 我注意到它改变了地址栏上的 URL 尽管我遇到过以这种方式链接的网站 但地址栏没有更新 这怎么可能 编辑 这可能是一个 AJAX 解决方案 如果他们
  • 如何在小米手机上以编程方式启用“在锁定屏幕上显示”权限[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 How can I enable show on lock screen permission on Xiaomi phones Is it
  • SVG TextPath 文本显示颠倒

    下面是颠倒显示路径上文本的 SVG 代码 请帮助说明如何正确显示它的正面
  • JDesktopPane 调整大小

    我们有一个具有两个 JFrame 和两个 JDesktopPanes 的应用程序 我们需要将内部框架从一个框架移动到另一个框架 我们遇到的问题是 将内部框架从第一个窗口移动到第二个窗口后 当我们调整第一个窗口的大小时 第二个窗口的内部框架也
  • 想要检查另一个片段中的复选框是否已选中

    我有 2 个片段 我想从片段 1 进行检查 看看片段 2 中的 CheckBox1 是否已选中 EDIT 我正在做以下事情 在主要活动中 TargetApi 11 public class gamesmodestab extends Act
  • 无法在 Liferay Portlet JSP 页面中包含 css 和 JS 文件

    我已经下载了 Jquery Image Slider 源代码并希望与我的 JSP 文件集成 这是我的文件夹结构 这就是我将他们纳入其中的方式
  • 在 vscode 扩展的集成测试期间打开工作区

    我有一个用例 我需要在主机环境中打开一个工作区以进行 vscode 测试 我想知道一个打开默认工作区的函数和另一个可以与await 一起使用的函数 以便测试函数等待工作区打开 None
  • 将 lm() 和 Predict() 应用于数据框中的多列

    我下面有一个示例数据集 train lt data frame x1 c 4 5 6 4 3 5 x2 c 4 2 4 0 5 4 x3 c 1 1 1 0 0 1 x4 c 1 0 1 1 0 0 x5 c 0 0 0 1 1 1 假设我