我正在尝试将连续变量(" relative_frequency_total")映射到二进制值(" topicality")。超过某个阈值的所有值应映射到一个,全部低于或等于另一个值。由于我希望结果变量尽可能保持预测,我首先获取连续变量的每个十分位数,尝试使用该十进制作为截止点映射relative_frequency_total,将得到的二进制变量提供给逻辑回归模型,并记住该模型&# 39; s R2,像这样:
quant_eval = data.frame("quantile" = numeric(100), "R2" = numeric(100))
counter = 1
for(q in seq(1,11,by=1)){
dom$topicality[dom$ranked_frequency_total > quantile(dom$ranked_frequency_total)[q]] <- "topical"
dom$topicality[dom$ranked_frequency_total <= quantile(dom$ranked_frequency_total)[q]] <- "non-topical"
tmp.lrm <- lrm(DOM ~ as.factor(topicality), data=dom)
quant_eval[counter,"quantile"] = q
quant_eval[counter,"R2"] = tmp.lrm$stats["R2"]
counter = counter+1
}
quant_eval
现在我的问题是:
(1)这适用于分位数1-4,但是在第5天我得到一条错误消息说&#34;话题有&lt; 2类别等级&#34;。这是什么意思?
(2)让我感到困惑的是,这个错误信息似乎取决于我尝试分位数的顺序。例如,当我在没有循环的情况下尝试分位数1或10时,一切都很好。当我单独尝试分位数5时,我得到了错误信息,当我再次尝试1和10时,我也得到了它。 lrm()不知何故记得我上次做了什么,或者为什么这样? 我还认为原因可能是我一次又一次地重复使用相同的列来映射ranking_frequency_total,但后来我尝试重命名列ea
原始数据帧dom相当庞大,但对我来说,错误消息可重复使用以下提取:
DOM relative_frequency_total
1 DAT 0.0203549061
2 DAT 0.0203549061
3 NOM 0.0005219207
4 NOM 0.0005219207
5 NOM 0.0005219207
6 NOM 0.0005219207
7 NOM 0.0015657620
8 NOM 0.0015657620
9 NOM 0.0015657620
10 NOM 0.0005219207
11 NOM 0.0005219207
12 NOM 0.0010438413
13 NOM 0.0010438413
14 NOM 0.0041753653
15 NOM 0.0005219207
16 NOM 0.0005219207
17 NOM 0.0041753653
18 NOM 0.0005219207
19 NOM 0.0010438413
20 NOM 0.0020876827
答案 0 :(得分:0)
查看?quantile
的文档。当您在默认情况下运行quantile
时,它将为您提供五分位数(精确切割点)。
quantile(dom$ranked_frequency_total)
0% 25% 50% 75% 100%
0.001747327 0.007373624 0.012441222 0.015827876 0.020194380
当你达到q = 5时, relative_frequency_total
的所有小于或等于分位数(dom $ ranking_frequency_total)[5],根据定义,它是最多dom$ranked_frequency_total
。因此,所有的自变量完全相同,这意味着您不再有两个因子级别,而是一个。
我猜你要分成十分位数,所以你可以使用:
quantile(dom$ranked_frequency_total,probs=seq(0,1,0.1))
但是请确保最多只能达到9,这样你就不会遇到同样的问题。
# Only set the rows you need
# quant_eval = data.frame("quantile" = numeric(100), "R2" = numeric(100))
quant_eval = data.frame("quantile" = numeric(9), "R2" = numeric(9))
# counter = 1 # No need for counter, just use q
for(q in 1:9){
# ifelse works nice here
# dom$topicality[dom$ranked_frequency_total > quantile(dom$ranked_frequency_total)[q]] <- "topical"
# dom$topicality[dom$ranked_frequency_total <= quantile(dom$ranked_frequency_total)[q]] <- "non-topical"
dom$topicality=ifelse(dom$ranked_frequency_total > quantile(dom$ranked_frequency_total,probs=seq(0,1,0.1))[q],'topical','non-topical')
tmp.lrm <- lrm(DOM ~ as.factor(topicality), data=dom)
quant_eval[q,"quantile"] = q
quant_eval[q,"R2"] = tmp.lrm$stats["R2"]
# counter = counter+1
}
但你也可以变得更优雅。
cut.points=10
quan.r2=function(q) {
topicality=ifelse(dom$ranked_frequency_total > quantile(dom$ranked_frequency_total,probs=seq(0,1,1/cut.points))[q],'topical','non-topical')
c(quantile=q,lrm(DOM ~ as.factor(topicality), data=dom)$stats['R2'])
}
t(sapply(seq(cut.points-1),quan.r2))
quantile R2
[1,] 1 0.02216367
[2,] 2 0.04580822
[3,] 3 0.09620369
[4,] 4 0.49200275
[5,] 5 0.37952599
[6,] 6 0.29053577
[7,] 7 0.21660100
[8,] 8 0.15282620
[9,] 9 0.09620369