【问题标题】:I am trying to use various transformations of the response variable and fit corresponding these model, and obtain residual plots for each model我正在尝试使用响应变量的各种变换并拟合相应的这些模型,并获得每个模型的残差图
【发布时间】:2021-11-16 05:18:55
【问题描述】:
library(GLMsData)
data(fluoro)
lambda <- seq(-2,2,0.5)
lm.out <- list()
for(i in length(lambda)){
  if(i != 0){
    y <- (fluoro$Dose^lambda-1)/lambda
  } else {
    y <- log(fluoro$Dose)
  }
  lm.out[[i]] <- lm(y[i]~Time, data = fluoro, na.exclude = T)
}
print(lm.out)

model.frame.default(formula = y[i] ~ Time, data = fluoro, drop.unused.levels = TRUE) 中的错误:可变长度不同(为“时间”找到)

我正在尝试使用响应变量的各种变换并拟合这些相应的模型,并获得每个模型的残差图。 我需要帮助。谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    这是问题中for 循环的更正版本。

    data(fluoro, package = "GLMsData")
    
    lambda <- seq(-2, 2, 0.5)
    
    lm.out <- list()
    for(i in 1:length(lambda)){
      if(lambda[i] != 0){
        y <- (fluoro$Dose^lambda[i]-1)/lambda[i]
      } else {
        y <- log(fluoro$Dose)
      }
      lm.out[[i]] <- lm(y ~ Time, data = fluoro, na.action = na.exclude)
    }
    print(lm.out)
    

    还有一个在lapply 循环中定义并使用了boxcox 函数的版本。

    boxcox <- function(x, lambda, na.rm = FALSE){
      if(na.rm) x <- x[!is.na(x)]
      if(lambda == 0){
        log(x)
      } else {
        (x^lambda - 1)/lambda
      }
    }
    
    lm_out2 <- lapply(lambda, \(l){
      lm(boxcox(Dose, lambda = l) ~ Time, data = fluoro, na.action = na.exclude)
    })
    

    检查上述两种方法是否产生相同的结果。

    coef_list <- sapply(lm.out, coef)
    coef_list2 <- sapply(lm_out2, coef)
    identical(coef_list, coef_list2)
    #[1] TRUE
    
    smry_list <- lapply(lm.out, summary)
    smry_list2 <- lapply(lm_out2, summary)
    
    pval_list <- sapply(smry_list, \(fit) fit$coefficients[, "Pr(>|t|)"])
    pval_list2 <- sapply(smry_list2, \(fit) fit$coefficients[, "Pr(>|t|)"])
    identical(pval_list, pval_list2)
    #[1] TRUE
    
    R2_list <- sapply(smry_list, "[[", "r.squared")
    R2_list2 <- sapply(smry_list2, "[[", "r.squared")
    identical(R2_list, R2_list2)
    #[1] TRUE
    

    【讨论】:

    • 感谢您的帮助。您能否解释一下 lapply 函数中的 `(l)` 是什么意思?
    • @Kwame \(l) 是一个 lambda 函数,一个匿名函数,在 R4.1.0 中引入。如果您运行的是旧版本的 R,请使用等效的 function(l) 语法。至于l,它代表向量lambda的每个元素。
    • 这很好。感谢您的教育。
    • @Kwame 我现在在lapply 循环中简化了对lm 的调用。有了参数data = fluoro,公式中不需要fluoro$Dose(在对boxcox的调用中),我已经删除了df名称。
    • @Kwame 请不要在 cmets 中发布代码。您现在发布的代码是关于图形的,这足以让您提出一个新问题。如果您这样做,请在您的评论中包含指向此问题的链接以及代码和新问题描述。另外,当someone answers您的问题时该怎么办。
    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 2019-06-06
    • 1970-01-01
    • 2017-09-14
    • 2018-07-07
    • 2010-12-18
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多