Перевести логистическую регрессию с 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% по сравнению с мужчинами, а вероятность трудоустройства у женщин младше 25 лет составляет -44,9%, чем у женщин в возрасте от 26 до 54 лет).

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

Вот моя первая попытка в 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 functions. Доктор Франк Харрел (автор package:rms), например.

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

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

Короче говоря, как это можно сделать с помощью R с rms функциями, такими как lrm?

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

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

Бинь


person balour    schedule 12.09.2013    source источник


Ответы (1)


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

 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  

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

person IRTFM    schedule 12.09.2013
comment
Да, я переименовал свой пост. В моем примере это просто бинарная регрессия. Мне нужно использовать полиномиальный для другого. Хотя моя проблема связана с LSMEANS. Хорошо, спасибо за ваш комментарий. Попробую на Crossvalidated. - person balour; 13.09.2013
comment
Спасибо!! Один час изо всех сил пытался найти as.numeric (переменную) для представления в виде непрерывных данных. - person Andre Silva; 05.11.2013
comment
Если variable был фактором, то было бы лучше использовать as.numeric(as.character(variable)) - person IRTFM; 05.11.2013