【问题标题】:Accessing intercept factor levels for a linear regression访问线性回归的截距因子水平
【发布时间】:2021-03-18 23:46:00
【问题描述】:

我正在做一个联合练习。其中一部分是对一堆因子水平输出进行线性回归。我试图找出一个程序化是找到最佳选择。回归输出如下所示:

(Intercept)   3.8750     0.9960   3.890  0.00367 **
Screen10     -0.3750     0.6591  -0.569  0.58329   
CellY        -0.3750     0.6591  -0.569  0.58329   
Price300     -0.8333     0.8022  -1.039  0.32599   
Price500     -1.1667     0.8022  -1.454  0.17982   
Battery8      1.1667     0.8022   1.454  0.17982   
Battery12     1.8333     0.8022   2.285  0.04814 * 
OSiOS         1.6667     0.8022   2.078  0.06752 . 
OSWindows    -1.6667     0.8022  -2.078  0.06752 . 

没有显示的是截距表示的因子级别 Screen7、CellN、Price100、Battery4 和 OSAndroid。

我的最佳选择是具有最高系数或部分效用的因素,从上到下将是 Screen7 (0)、Price100 (0)、CellN(0)、Battery12(1.833)、OSiOS(1.6667)。

我正在尝试编写一个 for 循环来迭代每个因素级别的电池、电池、屏幕等,并找到系数的最大值并将其存储在一个列表中,以编程方式提供我在上面看到的内容。

目前为止:

for (n in colnames(design_DF)){
    for (i in 2:length(design_DF)){
        choice = rep(NA, length(design_DF)-1)
        coef = dummy.coef(lm1)[i]
        coef2 = coef$n
        choice[i] = max(coef2)
    }
}

grep 会给我 coefs 的索引,然后存储 coef 值和 0 代表缺失因子水平的系数。

问题如您所见,当最大值为 0 时,我似乎无法弄清楚如何将因子水平值存储在列表中。代码中 index 和 coef 变量的输出是为了说“价格”是:

> index = grep("Price", names(lm1$coefficients))
> index
[1] 4 5
> coef = c(lm1$coefficients[index], 0)
> coef
  Price300   Price500            
-0.8333333 -1.1666667  0.0000000 

但该列表的最大值为 0,我需要能够存储 price100 作为列表中的变量。

谢谢

如果有帮助,这些是我的“指示”

which.max() 函数可用于确定与值列表中最大值关联的索引。例如,index = which.max(part_worths) 会将索引返回到part_worths 中的最大值。如果属性级别名称存储在字符串名称列表levels 中,则levels[index] 将返回具有最高部分价值的属性级别名称。

我尝试了以下解决方案,但供应给了我:

> sapply(choice[lengths(choice)>1], max)
  Screen     Cell    Price  Battery       OS 
0.000000 0.000000 0.000000 1.833333 1.666667 

我似乎无法访问 screen.7、cell.N 等

【问题讨论】:

  • 请编辑您的问题并澄清原始问题是什么,并澄清 dummy.coef 部分的合并取自答案,而不是原始问题的一部分。此外,发布的问题应具有完整的可重现代码和输入。有关提问的信息,请参阅r 标记的顶部。

标签: r for-loop


【解决方案1】:

计算虚拟系数。

library(nlme) # Alfalfa

fm <- lm(Yield ~ ., Alfalfa)
dc <- dummy.coef(fm); dc
## Full coefficients are 
##                                                                                    
## (Intercept):       2.033333                                                         
## Variety:            Cossack       Ladak      Ranger                                 
##                  0.00000000  0.09458333 -0.01916667                                 
## Date:                  None          S1         S20         O7                      
##                   0.0000000  -0.4405556  -0.2066667 -0.0900000                      
## Block:                    1           2           3          4          5          6
##                   0.0000000  -0.1808333  -0.0875000 -0.2066667 -0.5016667 -0.6875000

具有一个级别的虚拟系数,在本例中为截距,不是因子,因此提取具有多个级别的虚拟系数并从每个因子中获取最大系数,从而产生如图所示的数据框。

max.lev <- function(x) data.frame(level = names(x)[which.max(x)], value = max(x))
do.call("rbind", lapply(dc[lengths(dc) > 1], max.lev))
##         level      value
## Variety Ladak 0.09458333
## Date     None 0.00000000
## Block       1 0.00000000

【讨论】:

  • 感谢@G.Grothenieck。那行得通,但我需要能够存储单个虚拟值,但我的代码在 R Studio 中似乎无法以这种方式工作。当我应用您的代码时,请参见下文。您可以看到它没有给我 Screen.7 等,请参阅顶部的修改代码。
  • 修改了最后一行并添加了额外的代码来生成一个包含因子名称、最大水平和值的数据框。
【解决方案2】:

您应该将 pref = c( ) 从您的循环中取出,否则,您的循环每次都会不断重置它,并且您将始终只存储与上一个 i 相关的值。

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 2019-05-27
    • 2016-08-31
    • 2018-06-11
    • 2020-10-28
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多