0

我正在尝试将连续变量(“relative_frequency_total”)映射到二进制值(“topicality”)。高于某个阈值的所有值都应映射到一个,低于或等于它的所有值都应映射到另一个值。由于我希望结果变量尽可能保持预测性,我首先取连续变量的每个十分位数,尝试使用该十分位数作为截止点映射 relative_frequency_total,将生成的二元变量输入逻辑回归模型,并记住该模型的 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 位我收到一条错误消息,提示“话题性具有 <2 个类别级别”。这意味着什么?

(2) 真正让我感到困惑的是,这个错误消息似乎取决于我尝试分位数的顺序。例如,当我尝试不使用循环的分位数 1 或 10 时,一切都很好。当我单独尝试分位数 5 时,我收到错误消息,然后当我再次尝试 1 和 10 时,我也收到了。lrm() 是否记得我最后做了什么,或者为什么会这样?我还认为原因可能是我一次又一次地重复使用同一列来映射ranked_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
4

1 回答 1

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都小于或等于 quantile(dom$ranked_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
于 2012-07-26T16:24:22.503 回答