【问题标题】:From Stata to R: recoding bysort and xtreg从 Stata 到 R:重新编码 bysort 和 xtreg
【发布时间】:2017-08-21 16:37:50
【问题描述】:

我对 R 非常陌生,目前正在我大学的元研究课程的复制项目中工作。该论文研究了是否有一个家庭显示器来监控能源消耗是否会降低能源使用量。我已经重新编写了 300 行代码,但现在我遇到了一个我还无法解决的问题。

源码说:bysort id expdays: egen ave15 = mean(power) if hours0105==1

我明白这是做什么的,但我无法在 R 中复制它。id 是被检查家庭的标识符,expdays 表示实验的当天。所以ave15是每个家庭每天从午夜到早上6点的平均用电量。我发现(EIPbasedata 是包含每小时数据的完整数据集)

EIPbasedata$ave15[EIPbasedata$hours0105 == 1] <- ave(EIPbasedata$power, EIPbasedata$ID, EIPbasedata$ExpDays, FUN=mean)

可能会完成这项工作,但这给了我一个警告:

number of items to replace is not a multiple of replacement length

结果也不对。我不知道我能做些什么来解决这个问题。

接下来我很难重新编码的是:

xtreg ln_power0105 ihd0105 i.days0105 if exptime==4, fe vce(bootstrap, rep(200) seed(12345))

我认为正确的方法是使用plm,但我不确定如何实现if 条件(days0105 是实验中天数的运行变量,如果不在 0 之间,则为 0 -6am,ihd0105 是用于在家中显示的假人,exptime 表示凌晨 4 点 - 但我不明白 exptime 在这里做什么)

table4_1 <- plm(EIPbasedata$ln_power0105 ~ EIPbasedata$ihd0105, data=EIPbasedata, index = c("days0105"), model="within")

如何计算 plm 中的自举标准误差?

我希望一些专家可以帮助我,因为我的 R 和 Stata 知识不足以解决这个问题..

【问题讨论】:

  • 对于bysort id expdays: egen ave15 = mean(power) if hours0105==1,尝试类似library(dplyr); df %>% group_by(id, expdays) %>% mutate(ave15 = mean(power[hours0105 == 1]))
  • EIPbasedata <- EIPbasedata %>% group_by(ID, ExpDays) %>% mutate(ave15 = mean(power[hours0105 == 1])) 确实像一个魅力,现在我只需要让 plm 工作
  • 在您的xtreg 行中,if 条件是一个过滤器,因为回归是在数据子集上执行的,对吧?似乎过滤数据是合适的,例如使用subset(df, exptime==4)
  • 这就是问题所在,我不知道if条件是做什么的,因为我对Stata的了解非常有限。代码没有注释,论文本身也没有强调这一点。另外,在玩plm 我刚刚发现ave15 向量没有完全填充。 plm 会抛出错误,因为 NA/NaN/Inf in 'y' 和最后一个 hours0105 部分之后有一些 NaNave15 值。这是因为最后一个家庭的数据集确实从下午 1 点开始。因此 dplyr 无法完全填充向量。知道如何处理NaN in y 错误吗?
  • 好吧,如果我想进行回归并且一个家庭没有关于我关心的变量的数据,我可能会将其从我的数据集中排除。

标签: r replication stata


【解决方案1】:

我的讲师给了我答案:起初我确实指定了一个子样本,我在这里称之为tmp_datatmp_data <- EIPbasedata[which(EIPbasedata$ExpTime == 4) , ]

然后我用as.factor(days0105) 值对 tmp_data 进行回归,这是 R 等价于 i.days0105

tmp_results <- plm(tmp_data$ln_power0105 ~ tmp_data$ihd0105 + as.factor(tmp_data$days0105), data = tmp_data, index = ("ID"), model = "within")

可能有更好、更清洁的方法可以做到这一点,但我现在可以接受。

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 2020-05-12
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多