【问题标题】:R: extract orginal values from a formula modelR:从公式模型中提取原始值
【发布时间】:2014-09-07 04:37:19
【问题描述】:

我是 R 的新手,我正在创建一个函数来计算家具指数,试图让它更干净,用户只需要插入调整后的模型。我很难确定模型中的对数转换是自然对数还是任何其他类型,因为索引会根据这些信息发生变化。所以我想用 a=b^1/x 来计算这个信息,其中“a”是对数底,“x”和“b”分别是有/没有对数转换的公式信息。但为此我需要模型的原始值,因为通过使用“model$model”我只能得到对数值。

这是我到目前为止所做的:

furnival=function(object=NULL)
{
  w <- object$weights
  if(!is.null(object) && is.numeric(object))
    stop("'object' must be a formula")
  if(is.null(w <- object$weights)){
    w <- 1
  }else{
    w
  }
  if(length(grep("log", formula(object)))!=0){
    y <- as.numeric(as.matrix(object$model[1L]))
    modelValues <- object[Something to identify the original value]
    routine <- object$model == 1        
    if(any(routine))
       modelValues[!routine]
    modelValues <- sample(modelValues,1)
    a <- modelValues^(1/y)
    if(grep("log", formula(object))[1L]==2)
      y <- a^y
    if(a == exp(1)){ 
      df <- df.residual(object)
      MSE <- sum((residuals(object)^2)*w)
      index <- (exp(mean(log(y))))*(sqrt(MSE/df))
      return(index)
    }else{
      df <- df.residual(object)
      MSE <- sum((residuals(object)^2)*w)
      index <- (a^(mean(log(y,a))))*(sqrt(MSE/df))*(log(exp(1),a)^-1)
      return(index)
    }
  }
  else{
    df <- df.residual(object)
    MSE <- sum((residuals(object)^2)*w)
    index <- sqrt((MSE/df))
    return(index)
  }
}            

如果有办法做到这一点,或者即使有更聪明的方法来实现这个功能。

【问题讨论】:

  • 你能不能说明你是如何将值传递给这个函数的?也许您可以显示具有不同logs 的示例模型,并准确显示您希望针对每种不同情况的期望行为。此外,似乎这些代码中的某些代码可能并不真正需要制作 minimal reproducible example。尝试专注于一个非常具体的问题/任务,并删除任何对帮助您解决问题不必要的内容。
  • 这是我第一次在这里提出问题,我不太清楚如何问这个问题。不便之处敬请见谅。我正在尝试做的一些示例是这样的: mod
  • 如果你从模型中获得两组不同预测值的预测(使用predict(model, newdata = data.frame(...)),并比较它们?通过明智地选择这两个预测值设置,它应该能够识别出什么基础使用了对数。
  • @somoto 欢迎来到 Stack Overflow。如果人们要求提供更多信息,通常最好编辑您的原始问题以包含所请求的信息或描述。然后,您可以使用他们的“@”用户名添加评论,以通知他们更新。将重要信息放在难以扫描和格式化的 cmets 中并不是一个好主意。

标签: r model


【解决方案1】:

如果我仅在您尝试确定公式响应的对数转换的基础时隔离部分,则此辅助函数应该这样做。

getresplogbase <- function(obj) {
    if(class(obj)=="lm") {
        obj = terms(obj)
    }
    stopifnot(is(obj,"formula"))
    rhs <- obj[[2]]
    if (is.recursive(rhs)) {
        if(rhs[[1]]==quote(log)) {
            if(length(rhs)==2) {
                return(exp(1))
            } else {
                return(eval(rhs[[3]], environment(obj)))
            }
        } else {
            stop("unable to parse:", deparse(rhs))
        }
    } else {
        NA
    }
}

例如,你可以像这样使用它

getresplogbase(y~x)
# [1] NA
getresplogbase(log(y)~x)
# [1] 2.718282
getresplogbase(log(y,10)~x)
# [1] 10
a<-2
getresplogbase(log(y,a)~x)
# [1] 2

你也可以传入lm()模型

dd <- data.frame(y=runif(50,4,50)); dd$z=log(dd$y,2)+rnorm(50)
mod <- lm(log(z) ~ y, dd)
getresplogbase(mod)
# [1] 2.718282

所有这些都是通过仔细解析用于拟合模型的公式对象来完成的。

【讨论】:

  • 非常感谢@MrFlick。下次我提出问题时,我会按照您的指示进行操作。
猜你喜欢
  • 2012-03-30
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2016-04-23
  • 1970-01-01
相关资源
最近更新 更多