检查变量是否在R中是时不变的

时间:2016-10-07 07:50:01

标签: r variables time constants

我试着搜索我的问题的答案,但我找到了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是出生年份,如果个人投资于补充养老金形式,则笔是假人,其值为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不一样),所以我试图找到一种方法来检查是否每个身份,性是不变的。

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

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中的变量是否恒定,我会很高兴。

提前谢谢

2 个答案:

答案 0 :(得分:1)

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

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

为了解决这个问题,函数length(unique(x))会告诉您向量中不同唯一值的数量。对于一个因子,它与levels类似(但不相同,因为一个因子可能没有水平)。

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

最后,any(... > 1)检查是否有任何结果。如果是,则结果为TRUE(您可以使用which代替any来查找哪些内容。如果一切正常,结果将是FALSE

答案 1 :(得分:0)

我们可以尝试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