R эквивалент Stata для -l oop над макросами - PullRequest
1 голос
/ 23 февраля 2020

У меня есть переменная x, которая находится между 0 и 1, или (0,1]. Я хочу сгенерировать 10 фиктивных переменных для 10 децилей переменной x. Например, x_0_10 принимает значение 1, если x в диапазоне от 0 до 0,1, x_10_20 принимает значение 1, если x находится в диапазоне от 0,1 до 0,2, ...

Код Stata, который нужно выполнить, выглядит примерно так:

forval p=0(10)90 {
    local Next=`p'+10
    gen x_`p'_`Next'=0
    replace x_`p'_`Next'=1 if x<=`Next'/100 & x>`p'/100
}

Сейчас , Я новичок в R и мне интересно, как я могу сделать выше в R?

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

cut ваш друг здесь; его вывод - factor, который при использовании в моделях R автоматически расширяется до 10 фиктивных переменных.

set.seed(2932)

x = runif(1e4)
y = 3 + 4 * x + rnorm(1e4)

x_cut = cut(x, 0:10/10, include.lowest = TRUE)

summary(lm(y ~ x_cut))
# Call:
# lm(formula = y ~ x_cut)
# 
# Residuals:
#     Min      1Q  Median      3Q     Max 
# -3.7394 -0.6888  0.0028  0.6864  3.6742 
# 
# Coefficients:
#                Estimate Std. Error t value Pr(>|t|)    
# (Intercept)     3.16385    0.03243  97.564   <2e-16 ***
# x_cut(0.1,0.2]  0.43932    0.04551   9.654   <2e-16 ***
# x_cut(0.2,0.3]  0.85555    0.04519  18.933   <2e-16 ***
# x_cut(0.3,0.4]  1.26441    0.04588  27.556   <2e-16 ***
# x_cut(0.4,0.5]  1.66181    0.04495  36.970   <2e-16 ***
# x_cut(0.5,0.6]  2.04538    0.04574  44.714   <2e-16 ***
# x_cut(0.6,0.7]  2.44771    0.04533  53.999   <2e-16 ***
# x_cut(0.7,0.8]  2.80875    0.04591  61.182   <2e-16 ***
# x_cut(0.8,0.9]  3.22323    0.04545  70.919   <2e-16 ***
# x_cut(0.9,1]    3.60092    0.04564  78.897   <2e-16 ***
# ---
# Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# Residual standard error: 1.011 on 9990 degrees of freedom
# Multiple R-squared:  0.5589,  Adjusted R-squared:  0.5585 
# F-statistic:  1407 on 9 and 9990 DF,  p-value: < 2.2e-16

См. ?cut для дополнительных настроек

Вы можете также передайте cut непосредственно в RHS формулы, что облегчит использование predict:

reg = lm(y ~ cut(x, 0:10/10, include.lowest = TRUE))
idx = sample(length(x), 500)
plot(x[idx], y[idx])

x_grid = seq(0, 1, length.out = 500L)
lines(x_grid, predict(reg, data.frame(x = x_grid)), 
      col = 'red', lwd = 3L, type = 's')

plot with fit

0 голосов
/ 23 февраля 2020

Это не очень хорошо вписывается в комментарий, но для записи, код Stata может быть упрощен до

forval p = 0/9 {
    gen x_`p' = x > `p'/10  & `x' <= (`p' + 1)/10 
}

Обратите внимание, что - вопреки утверждению ФП - значения x точно ноль будет отображаться в ноль для всех этих переменных, как в их коде, так и в моем (что предназначено для упрощения их кода, а не для правильного способа, по модулю разницы вкуса в именах переменных). Это следует из того факта, что 0 не больше 0. Опять же, значения, которые в точности равны 0,1, 0,2, 0,3, в принципе будут go в нижнем, а не верхнем, но это осложняется тем фактом, что большинство кратные 0.1 не имеют точных двоичных представлений (0.5 - исключение).

Действительно, в зависимости от деталей об их настройке, о которых нам не говорит OP, индикаторные переменные (фиктивные переменные в их терминологии) вполне могут быть доступны в Stata без al oop или могут быть совершенно ненужными по факторной переменной. В этом отношении Stata ближе к R, чем может показаться на первый взгляд.

Не отвечая на вопрос напрямую, сигнал для пользователей Stata и R заключается в том, что Stata не должна быть такой неуклюжей, как это может быть выведено из кода в вопросе.

...