Bir yıldız gözlemci masasına maksimum olasılıkla tahmin edilen katsayıları alın


84

Stargazer, lm (ve diğer) nesneler için çok güzel lateks masalar üretir. Bir modeli maksimum olasılıkla uydurduğumu varsayalım. Hayalperestin tahminlerim için lm benzeri bir tablo oluşturmasını istiyorum. Bunu nasıl yapabilirim?

Biraz karmaşık olsa da, tahminlerimi içeren "sahte" bir lm nesnesi oluşturmak bir yol olabilir - bu, özet (my.fake.lm.object) çalıştığı sürece çalışacaktır. Bu kolayca yapılabilir mi?

Bir örnek:

library(stargazer)

N <- 200
df <- data.frame(x=runif(N, 0, 50))
df$y <- 10 + 2 * df$x + 4 * rt(N, 4)  # True params
plot(df$x, df$y)

model1 <- lm(y ~ x, data=df)
stargazer(model1, title="A Model")  # I'd like to produce a similar table for the model below

ll <- function(params) {
    ## Log likelihood for y ~ x + student's t errors
    params <- as.list(params)
    return(sum(dt((df$y - params$const - params$beta*df$x) / params$scale, df=params$degrees.freedom, log=TRUE) -
               log(params$scale)))
}

model2 <- optim(par=c(const=5, beta=1, scale=3, degrees.freedom=5), lower=c(-Inf, -Inf, 0.1, 0.1),
                fn=ll, method="L-BFGS-B", control=list(fnscale=-1), hessian=TRUE)
model2.coefs <- data.frame(coefficient=names(model2$par), value=as.numeric(model2$par),
                           se=as.numeric(sqrt(diag(solve(-model2$hessian)))))

stargazer(model2.coefs, title="Another Model", summary=FALSE)  # Works, but how can I mimic what stargazer does with lm objects?

Daha kesin olmak gerekirse: lm nesneleriyle, stargazer, bağımlı değişkeni tablonun üst kısmına güzel bir şekilde yazdırır, SE'leri karşılık gelen tahminlerin altında parantez içine alır ve tablonun altında R ^ 2 ve gözlem sayısı bulunur. Yukarıdaki gibi maksimum olasılıkla tahmin edilen "özel" bir modelle aynı davranışı elde etmenin (n kolay) bir yolu var mı?

Optim çıktımı bir lm nesnesi olarak giydirme konusundaki zayıf girişimlerim şunlardır:

model2.lm <- list()  # Mimic an lm object
class(model2.lm) <- c(class(model2.lm), "lm")
model2.lm$rank <- model1$rank  # Problematic?
model2.lm$coefficients <- model2$par
names(model2.lm$coefficients)[1:2] <- names(model1$coefficients)
model2.lm$fitted.values <- model2$par["const"] + model2$par["beta"]*df$x
model2.lm$residuals <- df$y - model2.lm$fitted.values
model2.lm$model <- df
model2.lm$terms <- model1$terms  # Problematic?
summary(model2.lm)  # Not working

6
texregPaket ile benzer bir şey yapmaya çalıştım . Tembellik nedeniyle, farklı bir modelin katsayılarının ve standart hatalarının üzerine yazdım ve bu da bana istenen çıktıyı verdi. Sizin durumunuzda, örneğin katsayılarının ve standart hatalarının üzerine yazabilirsiniz model1. Bu karmaşık bir çözüm olmasa da işe yaramalı. Söylemeye gerek yok, daha iyi bir çözüm olup olmadığını merak ediyorum ...
coffeinjunky

1
Ağır kaldırmayı birlikte yapan hayalci işlevine bir göz atabilirsiniz stargazer:::.stargazer.wrap. Tabloları biçimlendiren koda ek olarak bir dizi başka işleve sahip bir kap gibi görünür. Ve lm(ve glm) için birkaç bileşeni değerlendiriyor gibi görünüyor, bu da optim()sonuçlarınızı düzenlemenizi çok zorlaştırır .
andybega

3
İçinde texreg, işlevi texregkullanarak bir nesne oluşturmak yeterli olacaktır createTexreg. Temel olarak sadece katsayıları, SE'leri vb ?createTexreg. Teslim edersiniz. Bkz . texregNesne daha sonra beslenebilir texreg, htmlreg, screenregve plotregişlevleri. Alternatif olarak, JSS makalesinin 6. bölümü, aynı şablonu daha sonra geri dönüştürmek istemeniz durumunda yeni model türleri için yöntemlerin nasıl yazılacağını ve kaydedileceğini açıklar.
Philip Leifeld

Yanıtlar:


2

Ben sadece bu sorunu yaşıyordum ve bunun üstesinden Stargazer'ın içindeki coef seve omitişlevlerini kullanarak geldim ... örneğin

stargazer(regressions, ...
                     coef = list(... list of coefs...),
                     se = list(... list of standard errors...),
                     omit = c(sequence),
                     covariate.labels = c("new names"),
                     dep.var.labels.include = FALSE,
                     notes.append=FALSE), file="")

1

Önce kukla bir lmnesneyi somutlaştırmanız , ardından onu giydirmeniz gerekir:

#...
model2.lm = lm(y ~ ., data.frame(y=runif(5), beta=runif(5), scale=runif(5), degrees.freedom=runif(5)))
model2.lm$coefficients <- model2$par
model2.lm$fitted.values <- model2$par["const"] + model2$par["beta"]*df$x
model2.lm$residuals <- df$y - model2.lm$fitted.values
stargazer(model2.lm, se = list(model2.coefs$se), summary=FALSE, type='text')

# ===============================================
#                         Dependent variable:    
#                     ---------------------------
#                                  y             
# -----------------------------------------------
# const                        10.127***         
#                               (0.680)          
#                                                
# beta                         1.995***          
#                               (0.024)          
#                                                
# scale                        3.836***          
#                               (0.393)          
#                                                
# degrees.freedom              3.682***          
#                               (1.187)          
#                                                
# -----------------------------------------------
# Observations                    200            
# R2                             0.965           
# Adjusted R2                    0.858           
# Residual Std. Error       75.581 (df = 1)      
# F Statistic              9.076 (df = 3; 1)     
# ===============================================
# Note:               *p<0.1; **p<0.05; ***p<0.01

(ve sonra tabii ki kalan özet istatistiklerin doğru olduğundan emin olun)


0

Stargazer'ı kullanmaya ne kadar kararlı olduğunuzu bilmiyorum, ancak süpürgeyi ve xtable paketlerini kullanmayı deneyebilirsiniz, sorun şu ki size optimum model için standart hataları vermeyecek

library(broom)
library(xtable)
xtable(tidy(model1))
xtable(tidy(model2))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.