2014-01-05 4 views
2

Я что-то упустил?Являются ли веса в пакете truncreg сломанным?

library(truncreg) 

n <- 10^4 
lambda <- 0.3 # Proba y is taken from component 0 

df <- data.frame(x=rnorm(n)) 
df$y0 <- pmax(rnorm(n, 10 + df$x, 5), 0) 
df$y1 <- pmax(rnorm(n, 2 - 5*df$x, 2), 0) 
df$component <- ifelse(runif(n) < lambda, 0, 1) 
df$y <- ifelse(df$component == 0, df$y0, df$y1) # Mixture of censored regressions 

plot(df$x, df$y) 

model <- truncreg(y ~ x, data=df) # All data 
model.w <- truncreg(y ~ x, data=df, weights=component) # Only component 1, using weights 
model.subset <- truncreg(y ~ x, data=subset(df, component == 1)) # Only component 1, using subset 

identical(coefficients(model), coefficients(model.w)) # True -- I expected this to be false 
identical(coefficients(model.w), coefficients(model.subset)) # False -- I expected this to be true 

## For comparison, here is the same using lm: 
model <- lm(y ~ x, data=df) 
model.w <- lm(y ~ x, data=df, weights=component) 
model.subset <- lm(y ~ x, data=subset(df, component == 1)) 

identical(coefficients(model), coefficients(model.w)) # False as expected 
identical(coefficients(model.w), coefficients(model.subset)) # True as expected 
+0

Я не знаю, почему вы ожидали одинаковых коэффициентов для подмножества данных вашего компонента. Но что касается того, работают ли весы, я начну с построения графических моделей (всех из них), чтобы увидеть, имеют ли кривые различные формы. Если нет, то ваш весит просто не «достаточно драматичен», чтобы иметь значение. –

+0

@CarlWitthoft Я сделал некоторые изменения - теперь понятно, почему я ожидаю, что model.w и model.subset будут иметь одинаковые коэффициенты (как в случае с lm)? Компонент переменной df $ сконструирован так, чтобы сделать их идентичными. – Adrian

+0

Еще одно примечание: 'truncreg' не обрабатывает аргумент' weightights' как часть формулы, поэтому, даже если он использовал весы, вам нужно будет ввести его как 'df $ component' - я проверил это через 'debug' –

ответ

1

Да, я могу воспроизвести вашу проблему.
Затем я попытался установить method="model.frame" в lm пробегах и получить те же «неожиданные» результаты, которые вы получили, т. Е. Те же коэффициенты с применением или без весов. Я заглянул в источник truncreg и не увидел никакого очевидного места, которое «выбирает» не для использования method="model.frame"; затем я ворвался в источник truncreg.fit и снова не видел ссылки на значения весов. Мне непонятно, что делается , поэтому весы могут быть переданы в код соответствия, но я могу начать с более тщательного копания через этот код.

+1

Правильно, весы, кажется, не используются при установке. По-видимому, для включения весов можно было бы изменить внутреннюю функцию 'ml.truncreg', которая содержит функции для логарифмического правдоподобия, hessian и градиента, которые затем передаются в' maxLik' для подгонки. –

+0

@NatePope спасибо за подтверждение. Я полагаю, что дешевое исправление будет состоять в том, чтобы использовать значения веса для «увеличения» входных данных 'x' и' y' перед вызовом 'truncreg'. –

+0

Была ли эта ошибка когда-либо сообщена сопровождающему пакета? – Carl