【问题标题】:Check if a variable is time invariant in R检查变量是否在R中是时间不变的
【发布时间】:2016-10-07 07:50:01
【问题描述】:

我试图搜索我的问题的答案,但我找到了 Stata 的正确答案(我正在使用 R)。

我正在使用一项全国调查来研究哪些变量会影响对补充养老金的投资(在我的国家是自愿的)。

该调查每两年进行一次,有些人接受了不止一次的采访。我过滤了 df,以便只有在场的个人多次使用 filter 命令。这是已过滤的原始调查的示例:

year  id  y.b   sex   income   pens   
2002  1   1950   F    100000     0     
2002  2   1943   M    55000      1    
2004  1   1950   F    88000      1    
2004  2   1943   M    66000      1    
2006  3   1966   M    12000      1    
2008  3   1966   M    24000      1    
2008  4   1972   F    33000      0    
2010  4   1972   F    35000      0    

其中 id 是个人,y.b 是出生年份,pens 是一个虚拟变量,如果个人投资于补充养老金形式,则取值为 1。 我想运行 FE 回归,所以我加载了 plm 包,然后我像这样设置 df:

df.p <- plm.data(df, c("id", "year")

在这个命令之后,我希望常量变量被删除,但是在运行这个回归之后:

pan1 <- plm (pens ~ woman + age + I(age^2) + high + medium + north + centre, model="within", effect = "individual", data=dd.p, na.action = na.omit)

(其中,女性是一个变量,如果个人是女性,则取值为 1,高、中指教育水平,北部指地理区域,中心指地理区域)并且在命令 summary(pan1) 之后,变量女性仍然存在。

此时我认为调查中存在一些错误(例如性别没有正确插入,因此对于相同的 id 不一样),所以我试图找到一种方法来检查每个id,性别是不变的。

我试过这段代码,但我确定它不正确:

df$x <- ifelse(df$id==df$id & df$sex==df$sex,1,0)

基本思路应该是这样的:

df$x <- ifelse(df$id=="1" & df$sex=="F",1,0)

但我无法手动执行此操作,因为 df 由多达 40k 观察组成。

如果你知道另一种方法来检查变量在 R 中是否为常数,我会很高兴。

提前谢谢你

【问题讨论】:

  • df$x &lt;- (ave(df$sex, df$id, FUN = function(x)length(unique(x))) == 1)*1aggregate(sex ~ id, df, FUN = function(i) length(unique(i))==1)*1 取决于您想要的输出方式。

标签: r variables time constants


【解决方案1】:

我认为您要做的是计算每个 id 的唯一值的数量 sex。您希望它是 1,但任何 2 的情况都表示转录错误。在 R 中执行此操作的方法是

any(by(df$sex,df$id,function(x) length(unique(x))) > 1)

为了打破这一点,函数length(unique(x)) 告诉您向量中不同唯一值的数量。对于一个因子,它类似于levels(但不完全相同,因为一个因子可以有不存在的水平)。

函数by根据@​​987654328@计算df$sex的每个子集上的给定函数。换句话说,它计算length(unique(df$sex)),其中df$id 是1,然后是2,等等。

最后,any(... &gt; 1) 检查是否有任何结果大于一个。如果是,结果将是TRUE(您可以使用which 而不是any 来查找哪些)。如果一切正常,结果将是FALSE

【讨论】:

    【解决方案2】:

    我们可以试试dplyr
    示例数据:

    df=data.frame(year=c(2002,2002,2004,2004,2006,2008,2008,2010),
                  id=c(1,2,1,2,3,3,4,4),
                  sex=c("F","M","M","M","M","M","F","F"))
    

    Id 1 既是 F 又是 M

    library(dplyr)
    df%>%group_by(id)%>%summarise(sexes=length(unique(sex)))
    # A tibble: 4 x 2
         id sexes
      <dbl> <int>
    1     1     2
    2     2     1
    3     3     1
    4     4     1
    

    然后我们可以过滤:

    df%>%group_by(id)%>%summarise(sexes=length(unique(sex)))%>%filter(sexes==2)
    # A tibble: 1 x 2
         id sexes
      <dbl> <int>
    1     1     2
    

    【讨论】:

      猜你喜欢
      • 2016-12-28
      • 2014-09-08
      • 2015-08-17
      • 1970-01-01
      • 2017-02-13
      • 2011-12-19
      • 2020-09-30
      • 1970-01-01
      相关资源
      最近更新 更多