【问题标题】:Tobit regression in R, while looping regressions my data is not censored using censRegR中的Tobit回归,而循环回归我的数据没有使用censReg审查
【发布时间】:2021-12-25 12:43:54
【问题描述】:

蜂巢思维!

我正在对多个数据集(针对每种抗生素和浓度)进行循环回归分析。 部分数据在下限 3.912023 处被删失。所以在这些情况下我需要使用 censReg() 而不是 lm()。

即使多个子集包括下限,模型输出也是每个回归的 lm()。

对我在这里做错了什么有什么想法吗?

model.summary<- tibble()

for(j in unique(myData$antibiotic)){
        abx<- filter(myData, antibiotic == j)
        for(i in unique(abx$concentration)){
            if (min(abx$datapoints) == 3.912023){
                conc<-filter(abx, concentration == i)
                model<-censReg(x ~ y, data = conc, left = 3.912023) 
                model.coef<-coef(model)[2] 
                model.list<-c(j,i ,model.coef)
                model.summary<-bind_rows(model.summary, model.list)
} else {
                conc<-filter(abx, concentration == i)
                model<-lm(x ~ y, data = conc)
                model.coef<-coef(model)[2] 
                model.list<-c(j,i, model.coef)
                model.summary<-bind_rows(model.summary, model.list)
    }   

     }
}

编辑:

感谢 cmets 我解决了这个问题。使用 log(50) 的数值 (3.912023) 不适用于 if-else loop 以及 censReg 的限制。使用 log(datapoint) 解决了这个任务。

model_summary <- tibble ()


for (j in unique(censored2$antibiotic)) {
        abxs <- filter(censored2, antibiotic == j)
        print(j)
        for (i in unique(abxs$MIC)) {
                print(i)
                MICs <- filter(abxs, MIC == i)
                if(min(MICs$logCFU) == log(50) ){
                         print("censored")
                        my_model <- censReg(logCFU ~ hours, data = MICs, left = log(50))
                        my_coef <- coef(my_model)[2]
                        my_list <- c(j,i,my_coef)
                        model_summary <- bind_rows(model_summary, my_list)
                 } else {
                         print("not censored")
                        my_model <- lm(logCFU ~ hours, data = MICs)
                        my_coef <- coef(my_model)[2]
                        my_list <- c(j,i,my_coef)
                        model_summary <- bind_rows(model_summary,my_list)
                 }
        }
}

【问题讨论】:

  • 我会检查 if(min) 语句是否在您需要时评估为 TRUE。由于精度,在实数上检查相等性可能会很棘手。它有可能每次都评估为 FALSE 并因此运行 lm() 这就是为什么你没有得到审查
  • @NickCHK 我按照您的指示计算了每个子集的回归,问题似乎出在我的数据上。 censReg (Y ~ X, left = 3.91, right = Inf, data = myData) myData |antibiotic|conc|x|y| |B |4 |0 |14.1| |B |4 |0.167| 4.61| |B |4 |0.5 |3.91| |B |4 |1 |3.91| |B |4 |2 |3.91| |B |4 |5 |3.91|结果“没有审查意见”我进一步调查了“舍入”错误并使用 [left = log(50)] 导致另一个错误“特征错误(hess,对称 = TRUE,only.values = TRUE):无限或“x”中的缺失值”
  • 使用dplyr::near() 或类似abs(abx$datapoints - 3.912023) &lt; 1e-7(或其他一些数值公差)来检查实际值是否接近相等。
  • @mikeck 好主意,我检查了near(log(50), 3.912023),结果为 TRUE,所以它不是循环中的数值截止。
  • 我的意思是你不能在实数上可靠地使用==。所以你应该用near(min(MICs$logCFU), log(50))替换你的if语句中的min(MICs$logCFU) == log(50)

标签: r loops regression


【解决方案1】:

我建议您弄清楚问题发生在循环的哪一轮。然后,您可以调查此选定循环中的回归分析,并提供一个说明问题的最小示例。 (抱歉,我的评论不能作为“评论”发布,因为我还没有“50 声望”。)

【讨论】:

  • 我认为找到了问题的一部分(感谢@NickCHK 和@mikeck):使用 log 值 会干扰 min() 和 censReg()。当我使用原始 Y 而不是 log(Y) 的数值时,if-else 语句有效,对于审查 censReg(Y~X, left=Y) 而不是 censReg(log(Y)~X, left=log(Y) @Arne Henningsen 相同,那么我将如何转换回归计算?跨度>
  • 我是否正确理解 一些 循环中存在左删失,如果存在删失,则下限为 Y = 50,或者等效地为 log(Y ) = log(50) = 3.912023?做类似'if( min( Y ) == 50 ) { res
  • 是的,循环是针对一些观察被删减的数据。分析基于 exp。细菌生长。因此,我必须对原始数据 (Y) 应用对数以计算线性回归(截止值为 log(50))。对不起标签; log(Y) 是Y 的正确数据点。正如@mikeck 估计的那样,我在 log(50) 的实数上使用== 遇到了问题 - 3.912023。一旦我将其更改为 log(50) ,循环和 censReg 就适用于我的情况。为了避免进一步的问题,我听从了他的建议,并包含了 near() near(min(MICs$logCFU), log(50))
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2022-10-06
相关资源
最近更新 更多