在 R 中手动构建逻辑回归模型进行预测

2023-11-26

我正在尝试在数据集上测试逻辑回归模型(例如 3 个预测变量 X1、X2、X3 的 3 个系数)。我知道如何在创建模型对象后测试模型,例如,

mymodel <- glm( Outcome ~  X1 + X2 + X3 , family = binomial,data=trainDat)

然后测试数据

prob <- predict(mymodel,type="response",newdata=test)

但现在我想使用我拥有的系数和截距创建一个逻辑模型,然后用数据测试这个模型。

基本上我不清楚如何在不运行 glm 的情况下创建“mymodel”。

问题的背景: 我使用偏移量运行逻辑回归,例如:

mymodel <- glm(Outcome ~ offset(C1 * X1) + offset(C2 * X2) + X3, 
               family = binomial, data = trainDat)

因此,mymodel 对象生成仅具有截距 (I) 和 C3 系数(针对特征 X3)的模型。
我现在需要在测试数据集上测试完整模型(即 I + C1*X1 + C2*X2 + C3*X3),但我不知道如何获取完整模型,因为 mymodel 的输出只有拦截和C3。所以我认为我更普遍的问题是:“如何手动构建逻辑回归模型对象?”

感谢您的耐心等待。


我找不到一个简单的函数来做到这一点。里面有一些代码predict函数取决于拟合模型(例如确定模型的排名)。但是,我们可以创建一个函数来制作一个可以与预测一起使用的假 glm 对象。这是我第一次尝试这样的功能

makeglm <- function(formula, family, data=NULL, ...) {
    dots <- list(...)
    out<-list()
    tt <- terms(formula, data=data)
    if(!is.null(data)) {
        mf <- model.frame(tt, data)
        vn <- sapply(attr(tt, "variables")[-1], deparse)

        if((yvar <- attr(tt, "response"))>0)
            vn <- vn[-yvar]
            xlvl <- lapply(data[vn], function(x) if (is.factor(x))
           levels(x)
        else if (is.character(x))
           levels(as.factor(x))
        else
            NULL)
        attr(out, "xlevels") <- xlvl[!vapply(xlvl,is.null,NA)]
        attr(tt, "dataClasses") <- sapply(data[vn], stats:::.MFclass)
    }
    out$terms <- tt
    coef <- numeric(0)
    stopifnot(length(dots)>1 & !is.null(names(dots)))
    for(i in seq_along(dots)) {
        if((n<-names(dots)[i]) != "") {
            v <- dots[[i]]
            if(!is.null(names(v))) {
                coef[paste0(n, names(v))] <- v
            } else {
                stopifnot(length(v)==1)
                coef[n] <- v
            }
        } else {
            coef["(Intercept)"] <- dots[[i]]
        }   
    }
    out$coefficients <- coef
    out$rank <- length(coef)
    out$qr <- list(pivot=seq_len(out$rank))
    out$family <- if (class(family) == "family") {
        family
    } else if (class(family) == "function") {
        family()
    } else {
        stop(paste("invalid family class:", class(family)))
    }
    out$deviance <- 1
    out$null.deviance <- 1
    out$aic <- 1
    class(out) <- c("glm","lm")
    out
}

所以这个函数创建一个对象并传递所有的值predict and print期望找到这样的物体。现在我们可以测试一下。首先,这是一些测试数据

set.seed(15)
dd <- data.frame(
    X1=runif(50),
    X2=factor(sample(letters[1:4], 50, replace=T)),
    X3=rpois(50, 5),
    Outcome = sample(0:1, 50, replace=T)
)

我们可以拟合一个标准二项式模型

mymodel<-glm(Outcome~X1+X2+X3, data=dd, family=binomial)

这使

Call:  glm(formula = Outcome ~ X1 + X2 + X3, family = binomial, data = dd)

Coefficients:
(Intercept)           X1          X2b          X2c          X2d           X3  
    -0.4411       0.8853       1.8384       0.9455       1.5059      -0.1818  

Degrees of Freedom: 49 Total (i.e. Null);  44 Residual
Null Deviance:      68.03 
Residual Deviance: 62.67    AIC: 74.67

现在假设我们想尝试我们在出版物中读到的关于相同数据的模型。下面是我们如何使用makeglm功能

newmodel <- makeglm(Outcome~X1+X2+X3, binomial, data=dd, 
    -.5, X1=1, X2=c(b=1.5, c=1, d=1.5), X3=-.15)

第一个参数是模型的公式。这定义了响应和协变量,就像运行时一样glm。接下来,您像您一样指定家庭glm()。您需要传递一个数据帧,以便 R 可以嗅探所涉及的每个变量的正确数据类型。这还将使用数据框识别所有因子变量及其水平。因此,这可以是像拟合的 data.frame 一样编码的新数据,也可以是原始数据。

现在我们开始指定模型中使用的系数。将使用参数名称填充系数。未命名的参数将用作截距。如果您有一个因子,则需要通过命名参数为所有级别提供系数。在这里,我只是决定将拟合估计值四舍五入为“不错”的数字。

现在我可以使用我们的newmodel与预测。

predict(mymodel, type="response")
#         1         2         3         4         5
# 0.4866398 0.3553439 0.6564668 0.7819917 0.3008108

predict(newmodel, newdata=dd, type="response")

#         1         2         3         4         5
# 0.5503572 0.4121811 0.7143200 0.7942776 0.3245525

在这里,我使用旧数据和我指定的系数对原始模型和新模型进行预测。我们可以看到概率的估计发生了一些变化。

现在我还没有彻底测试这个功能,所以使用时需要您自担风险。我没有做尽可能多的错误检查。也许其他人确实知道更好的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 R 中手动构建逻辑回归模型进行预测 的相关文章

  • 根据另一列修改 data.table 的列并添加新列

    我有一个data table DT有两列 V1 V2 1 1 3 2 2 4 3 3 5 4 2 2 5 3 8 6 1 4 7 2 5 对于每一行 我想采用相同的所有条目V1并添加V2条目然后划分V2按该总和输入并添加到第三列中 例如 在
  • R/d3heatmap/shiny - 有没有办法在 d3 工具提示中嵌入图像?

    我想在滚动单元格时在 d3 工具提示中嵌入图像 而不是默认的行 列 值数据 library shiny library d3heatmap ui lt shinyUI fluidPage titlePanel Old Faithful Ge
  • 在R中使用grepl完成单词匹配

    考虑以下示例 gt testLines lt c I don t want to match this This is what I want to match gt grepl is testLines gt 1 TRUE TRUE 不过
  • 用均匀的彩色表面替换颜色点

    这是我的数据和当前的绘图 require ggplot2 a rep c 2 5 10 15 20 30 40 50 75 100 each 7 b rep c 0 001 0 005 0 01 0 05 0 5 5 50 10 c c T
  • 使用 geom_line 绘制多条线(基于分组)

    请帮助我 关于当我尝试在 ggplot2 中使用 geom line 绘制分组的多条线时遇到的问题 当我尝试根据一个变量 列 即 区域 对行进行分组时 问题就出现了 GDP time series analysis gt group by
  • 区分缺失值类型(无响应与跳过模式)

    对于可能没有仔细阅读密码本的数据集用户 您会建议如何区分缺失值类型 在这个玩具示例中 q2只询问那些回答 是 的人q1 这意味着有一个缺失值q2因为该人没有回应而缺失 并且有两个缺失值q2因为没有提出问题所以丢失了 library tidy
  • 如何删除 R 中字符向量中字符串的公共部分?

    假设一个字符向量如下 file1 p1 analysed samples txt file1 p1 raw samples txt f2 file2 p1 analysed samples txt f3 file3 p1 raw sampl
  • 如何转换 R 中列匹配模式中的值

    我有这个数据框mydf 专栏nucleotide可以有A T G C字母 我想更改字母A to T C to G G to C and T to A 如果strand列是 我该怎么做 mydf lt structure list seqna
  • R 神经网络在时间序列的最大步长内不收敛

    我正在编写一个神经网络来预测时间序列中的元素x sin x 2 在 R 中 使用neuralnet包裹 这就是训练数据的生成方式 假设窗口有 4 个元素 最后一个元素是必须预测的元素 nntr0 lt 1 25 sin 1 25 2 nnt
  • ggplot2 中的 date_minor_breaks

    我是初学者ggplot2 我无法使用date minor breaks在 x 轴上显示季度 刻度 这是我的代码 x lt c seq 1 12 time lt c 2010Q1 2010Q2 2010Q3 2010Q4 2011Q1 201
  • RStudio Shiny renderDataTable 字体大小

    我正在尝试减小 renderDataTable 中的字体大小 但找不到任何控制字体大小的示例 我读到可以通过 jquery 控制它 但我找不到任何例子 任何指导都会非常有帮助 因为我正在使用闪亮的 ioslides 演示文稿 并且我的数据表
  • 如何将表达式传递给ggplot中的geom_text标签? (继续)

    这是我的后续原问题 https stackoverflow com questions 63813557 how to pass an expression to a geom text label in ggplot了解如何将带下标的表达
  • 在 case_when 中创建 tidyeval 函数

    我有一个数据集 我喜欢根据这些值的概率分布来估算其中一个值 让我们先做一些可重现的例子 library tidyverse library janitor dummy1 lt runif 5000 0 1 dummy11 lt case w
  • Emmeans 连续自变量

    我想解释一下Type f with Type space实验的内容和速率Exhaustion product和定量变量Age 这是我的数据 res structure list Type space structure c 2L 2L 2L
  • R: eval(parse()) 错误消息:即使在解析中指定了“text=”也无法打开文件

    我多次对国家 地区列表进行分析 在每次迭代期间 结果应添加到向量中 下面我展示了一个简化的示例 仅针对一个国家 地区 没有循环 尽管我彻底寻找解决方案 但我找不到答案 this is my simplified country vector
  • 如何使用ggplot2在地图上添加经度和纬度线?

    我现在正在使用绘制加拿大地图ggplot2 因为默认的投影方式是 aea 阿尔伯斯等积 所以地图上的经度和纬度都是直线 我想知道如何在地图上以 110W 100W 90W 和 50N 60N 70N 的形式显示经度和纬度 它们应该是曲线 多
  • %<>%操作的含义

    这个操作有什么作用呢 test lt gt select name list 这是来自一个名为magrittr lt gt 意思是 取出左边的部分 用右边的部分修改它 覆盖左边的变量 如果你更熟悉dplyr 它相当于 test lt tes
  • 尽管+ geom_line() 图表中没有线条

    我已阅读文档 我认为我的代码应该是正确的 但输出中的点之间仍然没有线条 怎么了 x 轴是离散的 y 轴是连续的 My code point sqrmPrice lt ggplot overview df aes x areaSize y s
  • R Plotly 为条形图设置自定义颜色

    我有一个plotly我的 Shiny 应用程序中的条形图 我想在生成的条形图中设置每列的特定颜色 Here s some reproducible data df data frame Month c Jan Feb Mar Apr May
  • H2O R 中的子集化

    我有一个 h2o 对象 子集的标准 R sub1 lt trans trans Type 1 我在水中也尝试过同样的方法 它不工作 sub1 lt trans trans Type 1 我也尝试过 sub1 lt h2o exec tran

随机推荐

  • 使用jquery获取keyup位置[重复]

    这个问题在这里已经有答案了 可能的重复 如何获取文本区域中的插入符位置 如果我在 html textarea 控件中的任何位置键入 我需要获取 keyup 事件的当前位置 例如 Welcome to jQuery 所以我在 欢迎 之后有 表
  • 将本体与 Protege-OWL API 合并

    我使用 protege 创建了两个本体 并保存为 A owl B owl 我知道protege 4 0可以合并很多本体 我想使用protege owl API将本体A owl和B owl合并到C owl 但我不知道该怎么做 你可以帮帮我吗
  • 以最少的配置使用 Unity

    在工作中 我们经常使用Unity 它的工作非常出色 但是您使用它的次数越多 您的配置文件就会增长得越多 运行时问题也会增加得越多 并且您必须为每个测试项目重新创建统一配置的次数就越多 因此 我们最终得到了一个巨大的统一配置部分 必须在多个项
  • 在 Posix 中如何使用 dev_t 类型?

    我追求的是这种类型的含义以及什么接口可以使用它 Posix 规范中解释说dev t用于设备 ID 但是 对于路径所描述的任何对象 可以是文件 目录 fifo 或物理设备 来说 设备 id 意味着什么 例如 调用stat 应为您提供一个包含此
  • 将类添加到单击的元素

    我正在尝试向单击的元素添加一个类 有多个具有唯一 ID 的元素 因此我 不知道 元素的 ID 是什么 我可以使用以下代码的修改版本来实现此目的吗 Jquery document ready function this on click fu
  • 我如何在 iOS 5 中使用 CMDeviceMotion 获取设备的标题

    我正在使用陀螺仪开发 AR 应用程序 我使用了苹果代码示例公园 它使用旋转矩阵来计算坐标的位置 而且效果非常好 但现在我正在尝试实现一个 雷达 我需要根据设备航向来旋转它 我正在使用 CLLocationManager 标题 但它不正确 问
  • Angular ViewChildren 不会立即看到 ngFor 中的所有子级

    我有一个奇怪的行为 ViewChildren 对应于 ngFor 生成的子组件 ViewChildren 查询没有看到元素在数组中停留了很长时间 我所有的代码都在Plunker 打开控制台后查看 这是我的主要组成部分 Component s
  • XMLHttp请求超时

    如何为以下脚本添加超时 我希望它将文本显示为 时间到 var bustcachevar 1 bust potential caching of external pages after initial request 1 yes 0 no
  • Redis 获取大字符串很慢

    我是 Redis 的新手 所以如果这是一个愚蠢的问题 我深表歉意 我使用 Django 和 Redis 作为缓存 我正在腌制大约 200 个对象的集合并将其存储在 Redis 中 当我从 Redis 请求集合时 Django 调试工具栏通知
  • 带有固定包装器的引导网格 - 防止列堆叠

    正如标题所示 我正在尝试使用带有固定包装器的 Bootstrap 3 网格系统 但是 当我调整浏览器的大小时 即使包装器保持相同的大小 列也会堆积起来 顺便说一句 我正在使用版本 3 以便在移植网站后可以转向响应式布局 这是巨大的 而且我独
  • 使用 Snapshot 和 ParamMap 的 Angular Mock ActivatedRoute

    我正在使用这个 来自here constructor private heroService HeroService private activatedRoute ActivatedRoute ngOnInit const heroId t
  • 如何使用 JBoss 4.2.3 以编程方式找出我的 jboss 服务器正在侦听哪个端口?

    例如 如何确定我的简单 JBoss 4 2 3 服务器正在侦听端口 8080 这是我能达到的最接近的结果 但这不起作用 MBeanServerConnection server MBeanServerConnection new Initi
  • 量化约束与(封闭)类型族

    我正在尝试使用这篇博文的方法是在不悬而未决的情况下获取更高级的数据Identity简单情况的函子与量化约束推导一起 LANGUAGE TypeFamilies LANGUAGE QuantifiedConstraints Standalon
  • UITableView 在 iOS 7 中以偏移量开始

    我已将一个简单的 UITableView 拖到 iOS 7 中的 UIViewController 上 现在 在第一个单元格开始之前有一个垂直的空间偏移 我该如何摆脱它 我希望第一行更接近 UITableView 实际开始位置的上边缘 我没
  • 使用 .NET C# 连接到 Interbase 7.1 的最佳方法

    有人可以解释一下使用 NET C 连接到 Interbase 7 1 数据库的最佳方法吗 该应用程序将安装在许多最终用户计算机上 因此我必须与应用程序打包的 附加组件 越少越好 CodeGear 为 InterBase 的注册用户提供免费的
  • 如何更改熊猫箱线图中胡须的线条样式?

    有没有办法将 pandas 箱线图中胡须的线条样式更改为 默认值似乎是 我努力了 color dict boxes black whiskers black medians red caps black styles dict whiske
  • 如何在 C# 中跨本地网络进行 UDP 多播?

    我正在尝试在我的本地网络上进行一些简单的 UDP 通信 我想做的就是对网络上的所有机器进行多播 这是我的发送代码 public void SendMessage string message var data Encoding Defaul
  • c# - 如何将点移动给定距离 d (并获取新坐标)

    你好 我想知道是否有任何有效的方法来计算点的坐标 从原始位置移动了距离 d 假设我有一个点 P 0 3 0 5 我需要将该点随机方向移动距离 d 到目前为止 我通过随机选取新的 x 和 y 坐标来完成此操作 并且检查新旧点之间的距离是否等于
  • 经典 ASP - 捕获 500 错误

    我正在尝试诊断一个网站的问题 该网站似乎在代码中的某个地方抛出了错误 从错误日志来看 这似乎是由于 SQL 查询与错误代码的错误串联而导致的 SQL 语法错误 我的问题是 我无法重现该错误 但客户仍然收到该错误 这可能是由许多查询引起的 所
  • 在 R 中手动构建逻辑回归模型进行预测

    我正在尝试在数据集上测试逻辑回归模型 例如 3 个预测变量 X1 X2 X3 的 3 个系数 我知道如何在创建模型对象后测试模型 例如 mymodel lt glm Outcome X1 X2 X3 family binomial data