R语言 如何从“gls”对象中提取权重参数?

h7appiyu  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(119)

我正在使用nlme包创建一个广义最小二乘模型。下面是一个生成数据集的可复制示例:

# Load necessary library
library(nlme)

# Generate some data
set.seed(123)
my_data <- data.frame(
  y = rnorm(100),
  x = runif(100),
  z = factor(rep(1:2, each = 50)),
  g = factor(rep(1:2, each = 50)),
  h = factor(rep(1:2, 50))
)

# Create the model
mdl <- gls(y ~ x * z,
           weights = varIdent(form = ~ 1 | g * h),
           data = my_data)

# I can retrieve the model formula like this
model_formula <- formula(mdl)

在这段代码中,我可以使用formula(mdl)来获取模型公式。但是,我找不到从mdl对象检索weights参数的方法。我该怎么做?

jaxagkaj

jaxagkaj1#

要检索呼叫,请执行以下操作:

as.list(mdl$call)$weights
# varIdent(form = ~1 | g * h)

要获取权重,可以使用nlme::varWeights()函数:
返回与对象表示的方差函数结构对应的标准差的倒数。

varWeights(mdl$modelStruct)
#       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2 
# 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 
#       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2 
# 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 
# etc
ztyzrc3y

ztyzrc3y2#

它们被存储为attr字节。

attr(mdl$modelStruct$varStruct, 'weights')
#       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2 
# 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 
#       1*1       1*2       1*1       1*2       1*1       1*2       1*1       1*2 
# 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094 
# ...

str(mdl)在这种情况下有很大的帮助。
实际上,我们可以给予"gls"一种新的方法。

weights.gls <- function (object, ...) {
  wts <- attr(object$modelStruct$varStruct, 'weights')
  if (is.null(wts)) 
    wts
  else napredict(object$na.action, wts)
}

weights(mdl)
#       1*1       1*2       1*1       1*2       1*1       1*2  ...
# 1.0000000 0.8064094 1.0000000 0.8064094 1.0000000 0.8064094  ...
# ...

相关问题