2016-08-27 12 views
-1

パッケージにnetlm()というネットワーク回帰を実行しました。すべての結果は正常に見えます。しかし、私は各係数の標準誤差を見つけることができません。返されるモデルオブジェクトには標準エラーはありません。 summary()もエクスポートしません。それらを得る方法はありますか?`sna`パッケージで` netlm() `を使用した場合の回帰係数の標準誤差の求め方は?

IV0 <- list(SEX, GRADE, YEAR) 
M0 <- netlm(K1M, IV0, nullhyp = "qapspp", reps = 2000) 

summary.default(M0) ## check structure of returned model object 

# Length Class Mode  
# coefficients  4 -none- numeric 
# fitted.values 812 -none- numeric 
# residuals  812 -none- numeric 
# qr    4 qr  list  
# rank    1 -none- numeric 
# n    1 -none- numeric 
# df.residual  1 -none- numeric 
# tstat   4 -none- numeric 
# dist   8000 -none- numeric 
# pleeq   4 -none- numeric 
# pgreq   4 -none- numeric 
# pgreqabs   4 -none- numeric 
# nullhyp   1 -none- character 
# names   4 -none- character 
# intercept  1 -none- logical 

M0 ## print model object 

# OLS Network Model 

# Residuals: 
#   0%  25%  50%  75%  100% 
# -0.3669251 -0.3376203 -0.3066127 0.6623797 0.7340360 

# Coefficients: 
#    Estimate  Pr(<=b) Pr(>=b) Pr(>=|b|) 
# (intercept) 0.271072656 0.966 0.034 0.0605 
# x1   0.009641084 0.602 0.398 0.8360 
# x2   -0.031007609 0.169 0.831 0.3440 
# x3   0.029304737 0.774 0.226 0.4660 

# Residual standard error: 0.47 on 808 degrees of freedom 
# Multiple R-squared: 0.002094 Adjusted R-squared: -0.001611 
# F-statistic: 0.5651 on 3 and 808 degrees of freedom, p-value: 0.6382 

summary(M0) ## print model summary 

# Test Diagnostics: 

# Null Hypothesis: qapspp 
# Replications: 2000 
# Coefficient Distribution Summary: 

#  (intercept)  x1  x2  x3 
#Min  -3.15189 -4.84538 -3.08131 -2.75036 
#1stQ  -0.65506 -0.99759 -0.65075 -0.68183 
#Median  0.01805 -0.09364 0.06947 -0.01831 
#Mean  0.02510 -0.03473 0.03247 -0.01179 
#3rdQ  0.69636 0.90936 0.72701 0.63639 
#Max  3.29170 5.71549 2.71428 2.90498 

答えて

2

sna::netlm()$tstatに返されたTスコアを得るために、これらの標準誤差を計算し、それが明示的にこれらの値を返しません。しかし、それを得るのは簡単ではありません。

ことを思い出してください:係数とTスコアが報告されているので、あなたがstandard.errorを得るために、この式を反転することができます

t-score = coefficient/standard.error 

:だからあなたのモデルM0、のための標準誤差与え

standard.error = coefficient/t-score 

係数はちょうど:

with(M0, coefficients/tstat) 


私の最初の答えは$qrオブジェクトからそれらの標準誤差を計算することである。

std_coef <- function (model) { 
    sigma2 <- sum(model$residuals^2)/model$df.residual 
    Rinv <- backsolve(model$qr$qr, diag(model$rank)) 
    sqrt(rowSums(Rinv^2) * sigma2) 
    } 

std_coef(M0) 

この機能は、lm()によって返さlmObjectのために設計されています。しかしnetlm()lm()を基にしており、$qrオブジェクトも返すので、netlm()でも使用できます。

しかし、netlm()がt-scoreを返すとすぐに、そのショートカットを使用して回答を更新します。

0

QAPは、有意差を評価するために標準誤差を使用しないことに留意することが重要です。この手順は、まず、OLSを介して係数および標準誤差を計算し、次いで、指定された置換手順(この場合、「qapspp」)を介して試験統計の分布を作成する。次に、初期OLS係数をその分布と比較して、有意性を評価する。 OLS回帰からの標準誤差が必要であると仮定すると、独立行列と従属行列をベクトル化して、昔ながらの良い形式のlm()を使用するだけです。

いくつかのおもちゃネットワークを使用すると、これがどのように機能するかを確認できます。

nets<-rgraph(25,3) 
response<- nets[1,,]*2+nets[2,,]*5 
fit <- netlm(response, nets, nullhyp="qapspp") 
fit$coefficients 

[1] -0.019743805 2.052129105 5.086171312 -0.003684872 

#View the distribution of the third independent matrix 
plot(density(fit$dist[,4])) 
abline(v=fit$tstat[4]) 

enter image description here

、あなたがlm()を使用してOLS係数と標準誤差を見ることができますし、gvectorize()

ols <- lm(gvectorize(response) ~ gvectorize(nets[1,,]) + 
      gvectorize(nets[2,,]) + gvectorize(nets[3,,])) 

それらが同じであることを確認するために、2つのモデルからの係数を比較します。

fit$coefficients 
[1] -0.019743805 2.052129105 5.086171312 -0.003684872 

as.numeric(ols$coefficients) 
[1] -0.019743805 2.052129105 5.086171312 -0.003684872 

summary(ols)を使用すると、標準エラーが発生します。

ただし、これらの標準エラーは、ネットワークデータの性質上、信頼性が低く、Krackhardt(1988)などで詳しく説明されています。これらは、netlm()のサマリー出力のp値を計算するためには使用されません。代わりに、生成された配布が使用されます。そのプロセスでは、t統計を生成するために標準エラーが使用されますが、有意性は、上記のように、生成分布に観測されるt-statがどこにあるかによって異なります。

関連する問題