2015-01-04 2 views
0

У меня есть 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 | 
======================================= 

прямо вперед умножение двух переменных не является решение в некоторых значениях даст выход Medium (var1 = 0,75 и var2 = 0,8, например).

В модели я хотел бы использовать индексное выражение (а не категориальное преобразование). Это сохранит изменение данных.

Что f (var1, var2) предоставит мне этот индекс, который будет использоваться в lm/R?

Помощь !!!

+0

Таким образом, вы не хотите, чтобы индекс категоричны т.е. ' 'Low ',' Medium ',' High '', но, скорее, с учетом приведенной выше таблицы. Но вы не знаете, какой метод использовать для создания этого числового индекса? Я спрашиваю, потому что мне не очень понятно, что вы просите. – LyzandeR

+0

Да, я ищу способ создания числового индекса. Как указано ниже, использование минимума var1 и var2 устраняет вариации в var1 или var2. Я хотел бы сохранить его и, возможно, использовать его в регрессии. – kishore

+0

Можете ли вы привести пример? Что вам нравится в качестве вывода, если var1 = 0.1 и var2 = 0.2? Или вы можете объяснить, что хотите регрессировать? Возможно, это не самый простой способ. – Michiel

ответ

0

Я новичок в R languange и синтаксис, но, похоже, вы больше ищете функцию , а не процедуру.

Как насчет использования f (var1, var2) = min (var1, var2)? Ясно, что вы должны применить это к числовой версии и , затем классифицировать переменные.

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"); 
} 
+0

Существует встроенная функция с именем «взаимодействие», но она будет предоставлять классификацию значений непересекающихся 9, а не тип запрашиваемого взаимодействия. –

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)) 
+0

Несмотря на то, что 'cut' по умолчанию создает интервалы с закрытым положением и findInterval по умолчанию создает левые интервалы, в этой задаче мы получим те же результаты (почти все время). –

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 член из двух групп. Там будет достаточно простой код, с которым имеет низкий уровень ($ \ л 0,25 $), Medium ($ \ GE 0,25 & $ \ л 0,70 $) и высокой ($ \ 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 

Если вы использовать модификацию cfun, что делает заказанные факторов @ BenBolker, вы можете получить 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 автомагический чтит упорядочение факторов меток.

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 новых элементов, которые в этом примере объясняется, 100% дисперсии var1 и var2 (proporsion дисперсии в таблица выше).

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. Просто используйте мин (var1, var2) для каждой комбинации, и использовать это
  2. Умножить два , применяя граничное значение, если оно находится за пределами диапазона, который вы хотите, чтобы он был, например, если оба var1 и var2 высоки, а их продукт средний, тогда выберите 0.75 в качестве правильного значения.
  3. Согласно окончательного редактирования, вы можете просто умножить 2 вместе, не заботясь о «низком», «среда», «высокий»
+0

Чтобы ответить людям, используйте @their_name, иначе никто не получит сообщение. Высказывание этого для вашего сообщения выше. Я все еще считаю, что PCA - лучший выбор для этого. Дайте мне знать о ваших проблемах. – LyzandeR

+0

спасибо за ввод. Мне нужно включить рекомендуемый подход PCA в мою модель. В зависимости от результата я опубликую свои выводы. – kishore

+0

Прохладный, дайте мне знать. – LyzandeR

Смежные вопросы