我有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中使用的索引?
帮助!!!
答案 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'
条件表,但我认为如果您将在回归中使用上述内容,这是正确的做法。
如果上述情况不够令人满意(我不推荐)那么: