GLS: веса от внешнего объекта не оцениваются должным образом в цикле (неверный тип (список) для переменной) - PullRequest
0 голосов
/ 15 февраля 2019

Полагаю, ответ на этот вопрос очевиден, но я не могу его найти.Я хотел бы запустить модели gls (пакет nlme) для каждого элемента списка, предоставляя аргумент весов из другого объекта списка.Это не похоже на работу, и я получаю следующее сообщение об ошибке:

Error in model.frame.default(formula = ~my.w.ls + i + y + x, data = list( : 
invalid type (list) for variable 'my.w.ls'

Ниже я приведу работающий пример, чтобы показать, что работает, а что нет:

Примеры, которые работают:

library(nlme)

# ####SINGLE DATAFRAME AS INPUT####
# #Let's start with some dummy data and 
# #a single dataframe
# #Create dataframe
DF <- data.frame(x=1:8, xf=rep(c("a", "b"), 4),
                 y=rnorm(8), w=1:8, one=rep(1,8))
# #Fit gls model with weights
fit <- gls(y~x, data=DF, weights=varFixed(~w))
fit # #Ok, this works

Теперь GLS работает как следует с одним кадром данных в качестве входных данных.Это также имеет место, если я предоставлю аргумент весов с использованием отдельного объекта my.w:

# #Let's have a separate object as input for the weights parameter
my.w <- DF[["w"]]
# #Fit the gls model again, this time using "my.w" instead of
# #"w" stored in the DF dataframe
fit.w <- gls(y~x, data=DF, weights=varFixed(~my.w))
fit.w # #Ok this works

Теперь давайте создадим список фреймов данных и повторим подход сверху.Мне известно, что примеры данных, которые я создаю, одинаковы, и поэтому список не нужен, но предполагается, что это простой пример списка структур данных (независимо от результатов):

# ####MULTIPLE DATAFRAMES STORED IN LIST AS INPUT####
# #Now let's generate a list of dataframes
DF.ls <- replicate(10, DF, simplify = FALSE)

# #Fit gls models for each element of the list
fit.ls <- list()
for(i in 1:length(DF.ls)){
  fit.ls[[i]] <- gls(y~x, data=DF.ls[[i]], weights=varFixed(~w))
}
fit.ls[[i]] # #Ok, this works as well

# #It also works if we use my.w (= a separate object) for the weights parameter
fit.myw.ls <- list()
for(i in 1:length(DF.ls)){
  fit.myw.ls[[i]] <- gls(y~x, data=DF.ls[[i]], weights=varFixed(~my.w))
}
fit.myw.ls[[i]]

Обратите внимание, что независимо от того, использую ли я параметр весов, хранящийся в объекте DF.ls (w) или в качестве отдельного ОДНОзначного числового / целочисленного объекта (my.w), gls всегда будет работать.

Здесь я создаю свой входной параметр весов в виде отдельного списка, который затем подается в модель gls.

# #Now to the problem!
# #Let's create again a separate object as input for the weights parameter
# #but this time it is a list
my.w.ls <- replicate(10, my.w, simplify = FALSE)

fit.w.ls <- list()
for(i in 1:length(DF.ls)){
  fit.w.ls[[i]] <- gls(y~x, data=DF.ls[[i]], weights=varFixed(~my.w.ls[[i]]))
}
# #We get the error message:
# #Error in model.frame.default(formula = ~my.w.ls + i + y + x, data = list( : 
# #invalid type (list) for variable 'my.w.ls'
# #But the elements of the list "my.w.ls" are NOT lists:
class(my.w.ls[[1]])

Как видите, этот подход не работает, и я понятия не имею, почему этоэто тот случай.Я хотел бы предоставить модели gls отдельный входной список, который не является частью списка, который предоставляет остальные данные объекта.

Возможно ли это?

...