最尤法で推定された係数をスターゲイザーテーブルに取得します


83

Stargazerは、lm(およびその他の)オブジェクト用の非常に優れたラテックステーブルを作成します。最尤法でモデルを近似したとします。スターゲイザーに見積もり用のlmのようなテーブルを作成してもらいたいのですが。これどうやってするの?

少しハッキーですが、1つの方法は、私の見積もりを含む「偽の」lmオブジェクトを作成することかもしれません。summary(my.fake.lm.object)が機能する限り、これは機能すると思います。それは簡単に実行できますか?

例:

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?

より正確には、lmオブジェクトを使用すると、stargazerはテーブルの上部に従属変数を適切に出力し、対応する推定値の下の括弧内にSEを含め、テーブルの下部にR ^ 2と観測数を示します。上記のように最尤法で推定された「カスタム」モデルで同じ動作を取得する(簡単な)方法はありますか?

最適な出力をlmオブジェクトとしてドレスアップするための私の微妙な試みは次のとおりです。

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
私はtexregパッケージと同様のsthを試みました。怠惰のため、別のモデルの係数と標準誤差を上書きしてしまい、目的の出力が得られました。あなたの場合、例えばの係数と標準誤差を上書きすることができますmodel1。これは洗練されたソリューションではありませんが、機能するはずです。言うまでもなく、もっと良い解決策が出てくるかどうか
知りたい

1
で重い物を持ち上げるスターゲイザー機能を見てみましょうstargazer:::.stargazer.wrap。これは、テーブルをフォーマットするコードに加えて、他の多くの関数を備えたコンテナーのように見えます。そして、結果をドレスアップするのを非常に難しくするlm(およびglm)のかなりの数のコンポーネントを評価しているようoptim()です。
andybega 2014

3
ではtexreg、関数texregを使用してオブジェクトを作成するだけで十分createTexregです。基本的には、係数、SEなどを渡すだけです。を参照してください?createTexregtexregオブジェクトはその後に供給することができるtexreghtmlregscreenreg、およびplotreg機能。または、JSSの記事のセクション6では、後で同じテンプレートをリサイクルする場合に備えて、新しいモデルタイプのメソッドを記述して登録する方法について説明しています。
フィリップライフェルド2015年

回答:


2

私は、この問題を持つとの使用を介してこれを克服したcoef se、とomitスターゲイザー...例えば内の機能

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

最初にダミーlmオブジェクトをインスタンス化し、次にそれをドレスアップする必要があります。

#...
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

(そしてもちろん、残りの要約統計量が正しいことを確認してください)


0

スターゲイザーの使用にどれだけ熱心に取り組んでいるかはわかりませんが、ほうきとxtableパッケージを使用してみることができます。問題は、最適モデルの標準エラーが表示されないことです。

library(broom)
library(xtable)
xtable(tidy(model1))
xtable(tidy(model2))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.