【发布时间】: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) < 1e-7(或其他一些数值公差)来检查实际值是否接近相等。 -
@mikeck 好主意,我检查了
near(log(50), 3.912023),结果为 TRUE,所以它不是循环中的数值截止。 -
我的意思是你不能在实数上可靠地使用
==。所以你应该用near(min(MICs$logCFU), log(50))替换你的if语句中的min(MICs$logCFU) == log(50)
标签: r loops regression