2013-09-12 2 views
1

Вот мой вопрос дня:Перевести логистическую регрессию от SAS до R

На данный момент я учу себя Эконометрика и использования логистической регрессии. У меня есть код SAS, и я хочу быть уверен, что сначала понял это, прежде чем пытаться преобразовать его в R. (У меня нет и я не знаю SAS). В этом коде я хочу моделировать вероятность того, что один человек станет «безработным сотрудником». Под этим я подразумеваю «возраст» между 15 и 64, а «такт» = «без работы». Я хочу попытаться предсказать этот результат со следующими переменными: пол, возраст и idnat (номер национальности). (При прочих равных условиях). Код

SAS:

/* Unemployment rate : number of unemployment amongst the workforce */ 

proc logistic data=census; 
class sex(ref="Man") age idnat(ref="spanish")/param=glm; 
class tact (ref=first); 
model tact = sex age idnat/link=logit; 
where 15<=age<=64 and tact in ("Employee" "Jobless"); 
weight weight; 
format age ageC. tact $activity. idnat $nat_dom. inat $nationalty. sex $M_W.; 

lsmeans sex/obsmargins ilink; 
lsmeans idnat/obsmargins ilink; 
lsmeans age/obsmargins ilink; 
run; 

Это пример того, что база данных должна выглядеть так:

 idnat  sex  age tact  
[1,] "english" "Woman" "42" "Employee" 
[2,] "french" "Woman" "31" "Jobless" 
[3,] "spanish" "Woman" "19" "Employee" 
[4,] "english" "Man" "45" "Jobless" 
[5,] "english" "Man" "34" "Employee" 
[6,] "spanish" "Woman" "25" "Employee" 
[7,] "spanish" "Man" "39" "Jobless" 
[8,] "spanish" "Woman" "44" "Jobless" 
[9,] "spanish" "Man" "29" "Employee" 
[10,] "spanish" "Man" "62" "Retired" 
[11,] "spanish" "Man" "64" "Retired" 
[12,] "english" "Woman" "53" "Jobless" 
[13,] "english" "Man" "43" "Jobless" 
[14,] "french" "Man" "61" "Retired" 
[15,] "french" "Man" "50" "Employee" 

Это своего рода результат я хочу получить:

Variable Modality Value ChiSq Indicator 
Sex   Women  56.6% 0.00001 -8.9% 
      Men   65.5%  
Nationality 
      1:Spanish 62.6%  
      2:French 51.2% 0.00001 -11.4% 
      3:English 48.0% 0.00001 -14.6% 
Age 
      <25yo  33.1% 0.00001 -44.9% 
     Ref:26<x<54yo 78.0%  
      55yo=<  48.7% 0.00001 -29.3% 

(Я интерпретирую сказанное следующим образом: при прочих равных условиях у женщин есть вероятность -8.9% на работу против мужчин и тех, кто в возрасте 1 эссе, чем у 25, есть вероятность -44,9% от занятости, чем в возрасте от 26 до 54 лет).

Так что, если я хорошо понимаю, наилучшим подходом было бы использовать двоичную логистическую регрессию (link = logit). Это использует ссылки «мужчина против женщины» (секс), «сотрудник против безработных» (из переменной «такта») ... Предполагаю, что такт автоматически преобразуется в двоичную (0-1) переменную SAS.

Вот моя первая попытка в R. Я не проверить его еще (нужен мой собственный компьютер):

### before using multinom function 
### change all predictors to factors and relevel 
recens$sex <- relevel(factor(recens$sex), ref = "Man") 
recens$idnat <- relevel(factor(recens$idnat), ref = "spanish") 
recens$TACT <- relevel(factor(recens$TACT), ref = "employee") 

### Calculations of the probabilities with function multinom, 
### formatted variables, and conditions with subset 
glm1 <- glm(TACT ~ sex + age + idnat, data=census, 
+ weights = weight, subset=age[(15<=recens$age|recens$age<=64)] & TACT %in% 
+ c("Employee","Jobless"), family=binomial()) 

Мои вопросы:

На данный момент, кажется, есть много функций провести логистическую регрессию в R, например glm, которая, кажется, подходит.

Однако после посещения многих форумов, кажется, много людей рекомендует не пытается точно воспроизвести SAS PROC LOGISTIC, в частности, функциональные LSMEANS функции. Д-р Franck Harrel, (автор package:rms) за один.

Это, я думаю, моя большая проблема LSMEANS и ее варианты Obsmargins и ILINK. Даже после прочтения его описания несколько раз я не могу понять, как это работает.

До сих пор я понимаю, что он относится к структуре общей совокупности базы данных (т. Е. Расчеты выполняются с пропорциями общей совокупности). ILINK, по-видимому, используется для получения прогнозируемого значения вероятности (уровень безработицы, уровень занятости) для каждого из предикторов (например, женщина, тогда мужчина), а не значение, найденное по (экспоненциальной) модели?

Вкратце, как это можно сделать через R, с rms функциями, такими как lrm?

Я действительно потерялся во всем этом. Если бы кто-то мог объяснить мне это лучше и сказать мне, если я на правильном пути, это сделает мой день.

Благодарим вас за помощь и извините за все ошибки, которые мой английский немного ржавый.

Бинь

ответ

3

Это не полиномиальная логистическая регрессия проблемы, поскольку результат является двоичным. Кроме того, желаемый результат представляет собой набор двухсторонних таблиц. Автором rms является Фрэнк Харрелл (и он также является оригинальным автором Proc LOGISTIC.) Просто использование lrm в rms для создания набора двухсторонних таблиц казалось бы пустой тратой энергии. Это пример его использования в представлении многомерный анализ:

require(rms) 
lrm(tact ~ idnat+sex+as.numeric(age), data=dat) 
    #---------- 
Logistic Regression Model 

lrm(formula = tact ~ idnat + sex + as.numeric(age), data = dat) 

        Model Likelihood  Discrimination Rank Discrim.  
         Ratio Test   Indexes   Indexes  
Obs   15 LR chi2  15.19 R2  0.725 C  0.903  
Employee  6 d.f.   4 g  3.583 Dxy  0.806  
Jobless  6 Pr(> chi2) 0.0043 gr  35.981 gamma 0.806  
Retired  3       gp  0.420 tau-a 0.552  
max |deriv| 1e-04       Brier 0.147      

       Coef  S.E. Wald Z Pr(>|Z|) 
y>=Jobless  -9.2553 3.8673 -2.39 0.0167 
y>=Retired -13.5303 5.2031 -2.60 0.0093 
idnat=french 1.3199 1.8969 0.70 0.4865 
idnat=spanish 1.7379 1.5479 1.12 0.2616 
sex=Woman  -0.0033 1.3792 0.00 0.9981 
age    0.2213 0.0849 2.61 0.0091 

Чтобы получить полную мощность дэ функций регрессии в упак: среднеквадратичное, вам нужно будет создать datadist объекты и установите опцию дд. Этот вопрос скорее выходит за пределы того, что обычно приемлемо в SO, поскольку вы действительно не знаете, что делаете. Вы можете рассмотреть возможность публикации последующих вопросов по CrossValidated, чтобы выработать свои концептуальные пробелы в понимании.

+0

Да, я переименовал свой пост. В моем примере это всего лишь двоичная регрессия. Я должен использовать многочлен для другого. Хотя моя проблема связана с LSMEANS. Хорошо спасибо за ваш комментарий. Я попробую Crossvalidated. – balour

+0

Спасибо !! Борьба один час, чтобы узнать as.numeric (переменная) для представления в виде непрерывных данных. –

+1

Если 'variable' был фактором, тогда было бы лучше использовать' as.numeric (as.character (variable)) ' –

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