如何创建用于回归的索引?

时间:2015-01-04 12:26:39

标签: r regression

我有2个连续变量,每个变量的值都在[0,1]范围内。每个可分为低($ \ le 0.25 $),中($ 0.25 - 0.70 $)和高($ \ ge 0.7 $)。我需要使用两个变量创建索引,并在回归模型中使用此索引。生成的索引将按照以下真值表:

Var1/ Var2    | Low | Medium | High   |
=======================================
Low           | Low | Low    | Low    |
Medium        | Low | Medium | Medium |
High          | Low | Medium | High   |
=======================================

两个变量的直接向前乘法不是解决方案,因为某些值将产生中等输出(例如,var1 = 0.75和var2 = 0.8)。

在模型中,我想使用索引表达式(而不是分类转换)。这将保留数据变化。

f(var1,var2)将为我提供在lm / R中使用的索引?

帮助!!!

5 个答案:

答案 0 :(得分:1)

我不知道是否有内置功能,我无法立即找到它。你能用以下的东西吗?

get_index <- function(var1, var2)
{
    if (var1 < 0 || var1 > 1 || var2 < 0 || var2 > 1)
        return("out of range");

    low <- min(var1, var2);
    if (low < 0.25)
        return("Low");
    if (low <= 0.70)
        return("Medium");

    return("High");
}

答案 1 :(得分:1)

怎么样:

cfun <- function(x) cut(x,c(-0.01,0.25,0.7,1.01),
              labels=c("low","medium","high"))
var1c <- cfun(var1)
var2c <- cfun(var2)
comb <- ifelse(var1c=="low" | var2c=="low", "low",
           ifelse(var1c=="medium" | var2c=="medium", "medium",
                "high"))

或实际上,如其他答案所示:

cfun(min(var1,var2))

答案 2 :(得分:1)

在重新阅读你的请求之后,我(第二)猜测你想要这个:只有“数字索引”,你可以省去使用字符向量标签。如果在回归公式中作为数值变量输入,则该合成交互的p值将为联合“最小”递减水平条件提供“趋势检验”。

inter.n <-  pmin( findInterval(x, c(0, .25, .7, 1)), 
                  findInterval(y, c(0, .25, .7, 1)) )

早先的评论: 目前还不清楚当价值处于边界时你希望不平等如何发挥作用。当边界在右侧(默认)或左侧关闭时,可以使用findInterval函数。你说:“低($ \ le 0.25 $),中($ 0.25 - 0.70 $)和高($ \ ge 0.7 $)”,这将使得两个组成员的值为0.2或0.7。会有相当简单的代码,其中Low($ \ lt 0.25 $),Medium($ \ ge 0.25&amp; $ \ lt 0.70 $)和High($ \ ge 0.7 $):

  x=runif(1000)
  y=runif(1000)
 inter <- c("Low", "Middle", "High")[ pmin( findInterval(x, c(0,.25,.7,1)), 
                                          findInterval(y, c(0, .25, .7, 1)))]
> table(inter)
inter
  High    Low Middle 
    78    383    539 

如果您使用@ BenBolker的cfun修改了有序因子,您可以让pmin直接使用这些值:

cfun2 <- function(x) cut(x,c(0, 0.25, 0.7, 1.01), include.lowest=TRUE, 
               labels=c("low","medium","high"), ordered=TRUE)
inter.f <- pmin( cfun2(x) , cfun2(y) )

 table(inter.f)
#--------
inter.f
   low medium   high 
   449    473     78 

这在某种程度上是优越的,因为table函数自动地遵循因子标签的排序。

答案 3 :(得分:0)

我是R languange和语法的初学者,但似乎你更需要一个函数而不是一个过程。

使用f(var1,var2)= min(var1,var2)怎么样?显然,您必须将其应用于数字版本,然后 对变量进行分类。

答案 4 :(得分:0)

在我看来,既然你想在回归中使用这个新索引,那么你就是在尝试做所谓的特征消除。通常,如果变量总数很小,最好使用所有变量。现在,如果变量的数量很大而你需要消除一些,那么有多种方法可以做到这一点,包括逐步消除,递归特征消除等。

在您的情况下,您只有2个变量,基本上您希望将这两个变量合并而不会丢失任何差异。那么,就我而言,您可以使用的一件事是主成分分析。我们来看一个例子:

#create data
var1 <- runif(1:100)
var2 <- runif(1:100)
df <- data.frame(var1,var2)

#the below line will create a PCA model
PCAmod <- princomp(var1+var2,data=df) #uses formula syntax without a response variable

> summary(PCAmod)
Importance of components:
                          Comp.1
Standard deviation     0.4052599
Proportion of Variance 1.0000000
Cumulative Proportion  1.0000000

上面显示已经创建了一个新的主成分,即100个新元素的向量,在这个例子中解释了var1和var2方差的100%(上表中的方差的推测)。

newvar <- PCAmod$scores #the new vector

基本上,可以使用newvar代替var1和var2

如果您需要向量为[0,1]之间的数字,则可以对其进行缩放:

scaled_newvar <- scale(newvar,center=min(newvar), scale=max(newvar)-min(newvar) )

> summary(scaled_newvar)
     Comp.1      
 Min.   :0.0000  
 1st Qu.:0.2991  
 Median :0.4607  
 Mean   :0.4788  
 3rd Qu.:0.6566  
 Max.   :1.0000  

但是,以上可能无法确认您的'low','medium','high'条件表,但我认为如果您将在回归中使用上述内容,这是正确的做法。

如果上述情况不够令人满意(我不推荐)那么:

  1. 只需对每个组合使用min(var1,var2)并使用
  2. 将两者相乘,如果它超出您希望的范围,则应用边界值。如果var1和var2都很高且产品为中等,则选择0.75作为正确值。
  3. 根据你的最终编辑,你可以将2加在一起而不关心'低','中','高'