【问题标题】:Translate Logistic Regression from SAS to R将逻辑回归从 SAS 转换为 R
【发布时间】:2013-09-12 16:17:05
【问题描述】:

这是我今天的问题:

目前我正在自学计量经济学并使用逻辑回归。 我有一些 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 岁以下的人比 26 至 54 岁的人有 -44.9% 的就业机会) .

所以如果我理解得很好,最好的方法是使用二元逻辑回归 (link=logit)。这使用引用“男性与女性”(性别)、“员工与失业”(来自“机智”变量)......我认为“机智”会被 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 函数。 Franck Harrel 博士,(package:rms 的作者)之一。

也就是说,我想我的大问题是LSMEANS 及其选项ObsmarginsILINK。即使反复阅读了它的描述,我也很难理解它是如何工作的。

到目前为止,我对Obsmargin 的理解是它尊重数据库总人口的结构(即根据总人口的比例进行计算)。 ILINK 似乎用于获取每个预测变量(例如女性然后男性)的预测概率值(失业率、就业率),而不是(指数)模型找到的值?

简而言之,如何通过 R 使用 rms 函数如 lrm 来完成?

我真的迷失在这一切中。如果有人可以更好地向我解释并告诉我我是否走在正确的轨道上,那会让我很开心。

感谢您的帮助,并对所有错误表示歉意,我的英语有点生疏。

【问题讨论】:

    标签: r sas rms multinomial


    【解决方案1】:

    这不是多项逻辑回归问题,因为结果是二元的。此外,您想要的输出似乎是一组双向表。 rms 的作者是 Frank Harrell(他也恰好是 Proc LOGISTIC 的原作者)。仅仅在 rms 中使用 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 上发布后续问题,以解决您在理解上的概念差距。

    【讨论】:

    • 是的,我已经重命名了我的帖子。在我的示例中,这只是一个二元回归。我必须对另一个使用多项式。虽然我的问题是 LSMEANS。好的,谢谢您的评论。我会试试 Crossvalidated。
    • 谢谢!!挣扎了一个小时才找出 as.numeric(variable) 来表示为连续数据。
    • 如果variable是一个因素,那么最好使用as.numeric(as.character(variable))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2011-03-27
    • 1970-01-01
    • 2014-05-06
    • 2017-08-13
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多