修改glm函数以采用R中用户指定的链接函数

2024-02-04

In glm在 R 中,默认链接函数为Gamma家人是inverse,identity and log。现在对于我的特定问题,我需要使用伽玛回归和响应Y以及修改后的链接函数,其形式为log(E(Y)-1))。于是我考虑修改一些glmR 中的相关函数。有几个可能相关的函数,我正在为以前有过这方面经验的人寻求帮助。

例如,函数Gamma定义为

function (link = "inverse") 
{
  linktemp <- substitute(link)
  if (!is.character(linktemp)) 
    linktemp <- deparse(linktemp)
  okLinks <- c("inverse", "log", "identity")
  if (linktemp %in% okLinks) 
    stats <- make.link(linktemp)
  else if (is.character(link)) 
    stats <- make.link(link)
  else {
    if (inherits(link, "link-glm")) {
      stats <- link
      if (!is.null(stats$name)) 
        linktemp <- stats$name
    }
    else {
      stop(gettextf("link \"%s\" not available for gamma family; available links are %s", 
                    linktemp, paste(sQuote(okLinks), collapse = ", ")), 
           domain = NA)
    }
  }
  variance <- function(mu) mu^2
  validmu <- function(mu) all(mu > 0)
  dev.resids <- function(y, mu, wt) -2 * wt * (log(ifelse(y == 
                                                            0, 1, y/mu)) - (y - mu)/mu)
  aic <- function(y, n, mu, wt, dev) {
    n <- sum(wt)
    disp <- dev/n
    -2 * sum(dgamma(y, 1/disp, scale = mu * disp, log = TRUE) * 
               wt) + 2
  }
  initialize <- expression({
    if (any(y <= 0)) stop("non-positive values not allowed for the 'gamma' family")
    n <- rep.int(1, nobs)
    mustart <- y
  })
  simfun <- function(object, nsim) {
    wts <- object$prior.weights
    if (any(wts != 1)) 
      message("using weights as shape parameters")
    ftd <- fitted(object)
    shape <- MASS::gamma.shape(object)$alpha * wts
    rgamma(nsim * length(ftd), shape = shape, rate = shape/ftd)
  }
  structure(list(family = "Gamma", link = linktemp, linkfun = stats$linkfun, 
                 linkinv = stats$linkinv, variance = variance, dev.resids = dev.resids, 
                 aic = aic, mu.eta = stats$mu.eta, initialize = initialize, 
                 validmu = validmu, valideta = stats$valideta, simulate = simfun), 
            class = "family")
}

另外,为了使用命令glm(y ~ log(mu), family = Gamma(link = MyLink)),我是否还需要修改glm.fit功能?谢谢你!


更新和新问题

根据@Ben Bolker的评论,我们需要编写一个新的链接函数,名为vlog(以真实姓名"log(exp(y)-1)")。我发现make.link函数可能负责这种修改。它被定义为

function (link) 
{
  switch(link, logit = {
    linkfun <- function(mu) .Call(C_logit_link, mu)
    linkinv <- function(eta) .Call(C_logit_linkinv, eta)
    mu.eta <- function(eta) .Call(C_logit_mu_eta, eta)
    valideta <- function(eta) TRUE
  }, 

  ...

  }, log = {
    linkfun <- function(mu) log(mu)
    linkinv <- function(eta) pmax(exp(eta), .Machine$double.eps)
    mu.eta <- function(eta) pmax(exp(eta), .Machine$double.eps)
    valideta <- function(eta) TRUE
  }, 

  ...

  structure(list(linkfun = linkfun, linkinv = linkinv, mu.eta = mu.eta, 
                 valideta = valideta, name = link), class = "link-glm")
}

我的问题是: 如果我们愿意的话永久添加此链接功能vlog to glm,这样在每个 R 会话中,我们可以使用glm(y~x,family=Gamma(link="log(exp(y)-1)"))直接,我们应该使用fix(make.link)然后添加定义vlog到它的身体?或者fix()只能在当前的 R 会话中执行此操作吗?再次感谢!

还有一件事:我意识到也许另一个功能需要修改。这是Gamma, 定义为

function (link = "inverse") 
{
  linktemp <- substitute(link)
  if (!is.character(linktemp)) 
    linktemp <- deparse(linktemp)
  okLinks <- c("inverse", "log", "identity")
  if (linktemp %in% okLinks) 
    stats <- make.link(linktemp)
  else if (is.character(link)) 
    stats <- make.link(link)
  else {
    if (inherits(link, "link-glm")) {
      stats <- link
      if (!is.null(stats$name)) 
        linktemp <- stats$name
    }
    else {
      stop(gettextf("link \"%s\" not available for gamma family; available links are %s", 
                    linktemp, paste(sQuote(okLinks), collapse = ", ")), 
           domain = NA)
    }
  }
  variance <- function(mu) mu^2
  validmu <- function(mu) all(mu > 0)
  dev.resids <- function(y, mu, wt) -2 * wt * (log(ifelse(y == 
                                                            0, 1, y/mu)) - (y - mu)/mu)
  aic <- function(y, n, mu, wt, dev) {
    n <- sum(wt)
    disp <- dev/n
    -2 * sum(dgamma(y, 1/disp, scale = mu * disp, log = TRUE) * 
               wt) + 2
  }
  initialize <- expression({
    if (any(y <= 0)) stop("non-positive values not allowed for the 'gamma' family")
    n <- rep.int(1, nobs)
    mustart <- y
  })
  simfun <- function(object, nsim) {
    wts <- object$prior.weights
    if (any(wts != 1)) 
      message("using weights as shape parameters")
    ftd <- fitted(object)
    shape <- MASS::gamma.shape(object)$alpha * wts
    rgamma(nsim * length(ftd), shape = shape, rate = shape/ftd)
  }
  structure(list(family = "Gamma", link = linktemp, linkfun = stats$linkfun, 
                 linkinv = stats$linkinv, variance = variance, dev.resids = dev.resids, 
                 aic = aic, mu.eta = stats$mu.eta, initialize = initialize, 
                 validmu = validmu, valideta = stats$valideta, simulate = simfun), 
            class = "family")
}

我认为我们还需要修改

okLinks <- c("inverse", "log", "identity")

to

okLinks <- c("inverse", "log", "identity", "log(exp(y)-1)")

?


我基本上遵循示例的形式?family显示用户指定的表单链接qlogis(mu^(1/days)).

我们想要一个以下形式的链接eta = log(exp(y)-1)(所以反向链接是y=log(exp(eta)+1), and mu.eta = dy/d(eta) = 1/(1+exp(-eta))

vlog <- function() {
    ## link
    linkfun <- function(y) log(exp(y)-1)
    ## inverse link
    linkinv <- function(eta)  log(exp(eta)+1)
    ## derivative of invlink wrt eta
    mu.eta <- function(eta) { 1/(exp(-eta) + 1) }
    valideta <- function(eta) TRUE
    link <- "log(exp(y)-1)"
    structure(list(linkfun = linkfun, linkinv = linkinv,
                   mu.eta = mu.eta, valideta = valideta, 
                   name = link),
              class = "link-glm")
}

基本检查:

vv <- vlog()
vv$linkfun(vv$linkinv(27))  ## check invertibility
library("numDeriv")
all.equal(grad(vv$linkinv,2),vv$mu.eta(2))  ## check derivative

Example:

set.seed(101)
n <- 1000                       
x <- runif(n)
sh <- 2                        
y <- rgamma(n,scale=vv$linkinv(2+3*x)/sh,shape=sh)
glm(y~x,family=Gamma(link=vv))                       
## 
## Call:  glm(formula = y ~ x, family = Gamma(link = vv))
## 
## Coefficients:
## (Intercept)            x  
##       1.956        3.083  
## 
## Degrees of Freedom: 999 Total (i.e. Null);  998 Residual
## Null Deviance:       642.2 
## Residual Deviance: 581.8     AIC: 4268 
## 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改glm函数以采用R中用户指定的链接函数 的相关文章

  • 如何融合颜色和形状?

    当我有一个超过 6 个值的变量时 我的麻烦就开始了 因为这是 ggplot2 中 scale shape 函数的当前最大值 由于这个问题 我尝试使用另一个变量来解决这个问题 我只是将原始变量的长度包裹起来 这是我的示例代码 dataf lt
  • 按列分组的数据帧上 R 中的行之间的差异

    我希望通过 app name 获得不同版本的计数差异 我的数据集如下所示 app name version id count difference 这是数据集 data structure list app name structure c
  • 修复 ggplot 中构面中的数据顺序

    我在使用 ggplot 绘制数据时遇到问题 我无法使每个方面内的数据正确排序 我的样本数据是 data lt structure list Parameter c 0 1 0 7 0 0 0 2 0 2 0 7 0 0 0 1 0 3 0
  • R Data.Table 创建带有条件的变量

    我需要在下面的数据集中创建一个新变量 A X a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 The newvar如果X等于 2 5 7 或 9 否则 newvar应该是 0 Code dt1 lt dat
  • 使用 R 读取和转换二进制原始数据

    我有一个file https drive google com file d 0BxMpk0nhnJy6SFhxd2xuMzJYYlk edit usp sharing其中包含原始 二进制数据和 ascii 它包含一个时间戳和一个代表速度的
  • 确定向量中是否存在元素的最有效方法

    我有几种算法取决于确定元素是否存在于向量中的效率 在我看来 这 in 这相当于is element 应该是最有效的 因为它只返回一个布尔值 在测试了几种方法之后 令我惊讶的是 这些方法是迄今为止效率最低的 以下是我的分析 随着向量大小的增加
  • 当测试集中不存在响应变量时,h2o 预测有时会失败

    当在不存在响应变量的测试集上进行预测时 如果在训练中对因子变量使用一种热编码 则 h2o 会以各种不同的方式失败 无论是在训练 GLM 时隐式指定还是在其他方法中显式指定时 R 3 4 0 和 h2o 3 12 0 1 中存在此错误 我们还
  • 优化 R 中的嵌套 for 循环

    我尝试加速下面的代码 但没有成功 我读到Rfast https cran r project org web packages Rfast Rfast pdf包 但我也未能实现该包 有没有办法优化R中的以下代码 RI lt function
  • 建模前减少因子水平数量

    我有一个 2600 个级别的因子 我想在建模之前将其减少到 10 我想我可以通过这样的操作来做到这一点 如果一个因素列出的次数少于 x 次 则应将其放入名为 其他 的存储桶中 这是一些示例数据 df lt data frame colour
  • 抑制 R 中的错​​误消息

    我正在 R 中运行模拟研究 有时 我的模拟研究会产生错误消息 当我在函数中实现模拟研究时 当出现此错误消息时模拟停止 我知道抑制错误是不好的做法 但此时对我来说 除了抑制错误然后继续下一个模拟 直到达到我喜欢运行的模拟总数为止 没有其他选择
  • 在ggplotly散点图中添加自定义数据标签

    我想显示Species对于每个数据点 当光标位于该点上方而不是 x 和 y 值时 我用iris数据集 另外 我希望能够单击数据点以使标签持久存在 并且当我在图中选择新位置时标签不会消失 如果可能的话 最基本的是标签 持久性问题是一个优点 这
  • 具有动态变量数的公式

    假设有一些 data framefoo data frame想要找到目标列的回归Y由其他一些专栏 为此目的 通常使用一些公式和模型 例如 linear model lt lm Y FACTOR NAME 1 FACTOR NAME 2 fo
  • 使用滑动窗口动画 ggplot 时间序列图

    我正在寻找在不失去分辨率的情况下对长时间序列图进行动画处理的方法 我希望视图能够 平移 数据 显示从开始到结束的滑动子集 假设我有以下内容 library ggplot2 library dplyr library gganimate df
  • jupyter 中的 r 图形 - 无法启动 png() 设备

    我在 Jupyter 中使用 R 但无法在笔记本本身中绘制图表 这是一个可重现的示例 set seed 123 mat as matrix x rnorm 100 y rnorm 100 plot mat 在朱皮特中 Error in pn
  • 聚合日期时间以总结在特定条件下花费的时间

    我很困惑我应该如何继续 我下面有一些虚拟数据 Date lt as POSIXct c 2018 03 20 11 52 25 2018 03 22 12 01 44 2018 03 20 12 05 25 2018 03 20 12 10
  • 将日期时间字符串转换为 Date 类

    我有一个带有日期时间字符列的数据框 当我使用as Date 除了少数实例之外 我的大多数字符串都被正确解析 下面的示例有望向您展示发生了什么 my attempt to parse the string to Date uses the s
  • 将不同的 grViz 组合成一个图

    我想结合不同的DiagrammeR绘制成一个图形 生成的图如下例所示 library DiagrammeR pDia lt grViz digraph boxes and circles a graph statement graph ov
  • 在函数中使用 quit/q 会导致 RStudio 出现致命错误

    更多的是好奇 但当你使用时q or quit在 R studio 内的函数内部 它会导致致命错误 如下所示 但 rgui 中的相同函数会导致 R 像往常一样停止 并且仅使用q 在 RStudio 中按预期关闭 R 为什么q在函数中导致 RS
  • 从 data.frame 中提取时用 NA 填充缺失的列

    我有一个函数 它将具有某些列的数据框作为输入 columns a b z 现在我有一个数据框DF只有很少的这些列DF columns f u z 如果列不在其中 如何创建一个包含所有值为 NA 的列的数据框DF这与DF在柱子上 f u z
  • 如何使用 R 中的函数 sqlSave() 将数据附加到具有 IDENTITY 主键的 SQL Server 表?

    我在SQL Server中创建了一个表 如下所示 CREATE TABLE testPK ID INT NOT NULL IDENTITY 1 1 PRIMARY KEY NumVal NUMERIC 18 4 现在我想使用 RODBC 函

随机推荐

  • 在项目的浏览器列表中配置的一个或多个浏览器

    我是离子框架的新手 启动离子应用程序时收到以下警告 请提出修复建议 ng One or more browsers which are configured in the project s Browserslist configurati
  • 鼠标移动/滚动到下一个哈希

    我添加了以下代码以便用鼠标滚动 通过单击 拖动滚动 而不是通过鼠标滚轮滚动 到目前为止 一切都很好 就像魅力一样 var clicked false clickY document on mousemove function e click
  • 枚举两个大数组的快速方法?

    我有两个大数组要处理 但让我们看一下下面的简化示例来了解一下这个想法 我想查找是否有一个元素data1与中的元素匹配data2并返回两者的数组索引data1 and data2如果以新数组的形式找到匹配项 index of data1 in
  • Aurelia 中 fetch() 的错误处理

    我有一个 API 其中包含服务器引发错误 状态 500 时出现的问题的有用描述 该描述作为响应文本的一部分 我的客户端代码使用 Aurelia 通过以下方式调用 apiaurelia fetch client使用通用方法进行调用 funct
  • AADB2C90077:用户没有现有会话,请求提示参数的值为“无”

    我有一个 Angular 应用程序 它使用MSAL js https github com AzureAD microsoft authentication library for js当我尝试获取访问令牌时 我收到以下错误 AADB2C9
  • 如何在 Sublime Text 3 中切换 XML 行注释

    我正在使用 Sublime Text 3 我遇到了问题 我不知道如何切换 XML 行注释 我知道有一个Toggle CommentSublime Text 3 中的函数 我尝试过 然而 结果却和我想象的不一样 例如 我想切换注释以下 XML
  • 是否可以从 MatLab 代码生成流程图? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我继承了一个 MatLab 项目 其中有一堆我需要重构的 MatLab 文件 能够生成流程图或类似的内容对我有很大帮助 我用谷歌搜索了
  • vs code live sass 编译器不更新文件

    所以有人之前问过类似的问题但没有得到答案 我正在学习 SASS 并在 vs code 中使用实时 sass 编译器 但它没有更新任何内容 我可以让 app css 文件显示更改的唯一方法是按下观看按钮并基本上重置该内容 以前没有这样做过 我
  • macOS 更新后 Git 无法工作(“xcrun:错误:无效的活动开发人员路径 (/Library/Developer/CommandLineTools”)

    我更新到最新的操作系统 和 或重新启动计算机 每次重大更新都会发生这种情况 但这一次我所做的只是在 2022 年 9 月 13 日重新启动计算机 今天早上 我在我的命令行中导航到我的工作代码库MacBook Pro https en wik
  • 我是否应该对共享进程生命周期的对象调用 dispose ?

    我知道所有实现的对象IDisposable一旦不再需要它们就应立即处置 以释放其非托管资源使用的内存 我的问题与我所知道的物体有关事实上将一直存活到主机进程本身终止 如果我处理掉它们 会有什么影响吗 进程终止时是否有可能内存未被释放 GDI
  • Swagger 不显示真正的错误消息

    我们使用 NET WebAPI 框架 并在 Web API 之上使用 swagger 来进行注释和开箱即用的 UI 体验 到目前为止 它运行得很好 但是 当我从 WebAPI Http 400 返回错误时 代码如下 return BadRe
  • 如何解决 IndexError: 在 Python 中使用循环内的数组列出赋值索引超出范围

    我是蟒蛇新手 我正在创建 2 个数组file name 存储文件的名称 和path 存储文件的路径 的价值观path数组在 while 循环内分配 但我收到错误 IndexError Python 中的列表赋值索引超出范围 我已经在这上面浪
  • 我可以在同一台机器上拥有/使用不同版本的导轨吗

    我实际上正在阅读一本为 Rails 2 3 5 编写的 Rails 书籍 我也想测试 Rails 3 beta 我的 Mac OS leopard 中是否可以进行这样的设置 我尝试过使用 gem list drails 我的Mac中存储了许
  • Qt 小部件的命名约定

    我正在与一群其他程序员合作开发一个使用 C 和 Qt 构建的开源项目 现在 我们需要一个小部件 以及其他变量 的命名约定 以将其用作所有代码中的标准 以便代码获得更好的可读性 并且我们可以在程序员之间获得更好的协调 有什么建议吗 编辑 我不
  • 如何检查 Observable 数组的长度

    在我的 Angular 2 组件中 我有一个 Observable 数组 list Observable
  • 如何在 Flutter 中将 textEditiing 控制器与 Provider 结合使用

    我正在使用提供程序进行状态管理 我的情况是我的表单中有多种类型的字段 问题出在文本字段上 每当我更改文本时 它都会表现得很奇怪 就像输入的文本以相反的顺序显示一样 class MyProvider with ChangeNotifier S
  • 如何使用kazoo客户端进行leader选举?

    这是 kazoo readthedocs 上提到的代码 election zk Election electionpath my identifier 要传递哪些输入参数才能使特定节点成为领导者 即 electionpath 和 my id
  • jQuery - 数据表插件 - 排序问题

    我正在使用 DataTables 插件http datatables net http datatables net 该插件本身非常有用 但我有一个很大的问题 它以以下格式返回某些搜索的地址列表 1 Main Street 12 Main
  • 如何按插入时间对 Meteor 集合进行排序?

    我正在使用 Meteor 进行我的第一个项目 并且在排序方面遇到一些困难 我有一个表单 用户可以在其中输入格言 然后显示在列表中 目前 最新的警句会自动显示在列表底部 有没有一种简单的方法可以让最新的出现在列表的顶部 I tried Tem
  • 修改glm函数以采用R中用户指定的链接函数

    In glm在 R 中 默认链接函数为Gamma家人是inverse identity and log 现在对于我的特定问题 我需要使用伽玛回归和响应Y以及修改后的链接函数 其形式为log E Y 1 于是我考虑修改一些glmR 中的相关函