создавать новые с разными формулами.

лкиваюсь со странным поведением при звонкеlm в пределахlapply с помощьюweights аргумент.

Мой код состоит из списка формул, по которым я запускаю линейную модель, которую я вызываю вlapply, Пока это работает:

dd <- data.frame(y = rnorm(100),
                 x1 = rnorm(100),
                 x2 = rnorm(100),
                 x3 = rnorm(100),
                 x4 = rnorm(100),
                 wg = runif(100,1,100))

ls.form <- list(
  formula(y~x1+x2),
  formula(y~x3+x4),
  formula(y~x1|x2|x3),
  formula(y~x1+x2+x3+x4)
)

res.no.wg <- lapply(ls.form, lm, data = dd)

Тем не менее, когда я добавляюweights аргумент, я получаю странную ошибку:

res.with.wg <- lapply(ls.form, lm, data = dd, weights = dd[,"wg"])
Error in eval(extras, data, env) : 
  ..2 used in an incorrect context, no ... to look in

Это как если бы... изlapply был в конфликте с... изlm звонить, но только из-заweights аргумент.

Любая идея была причиной этой проблемы и как это исправить?

ПРИМЕЧАНИЕ: использование звонка безlapply работает как положено:

lm(ls.form[[1]], data = dd, weights = dd[,"wg"] )

Call:
lm(formula = ls.form[[1]], data = dd, weights = dd[, "wg"])

Coefficients:
(Intercept)           x1           x2  
   -0.12020      0.06049     -0.01937  

РЕДАКТИРОВАТЬ Последний звонокlapply в пределахfunction типа:

f1 <- function(samp, dat, wgt){
res.with.wg2 <- lapply(ls.form, function(x) {lm(formula = x, data=dat[samp,], weights=dat[samp,wgt])})
}

f1(1:66, dat=dd, wgt = "wg")
 G. Grothendieck20 дек. 2017 г., 16:39
ХОРОШО. Я закрыл другой ответ и связал его с этим.
 John Paul20 дек. 2017 г., 15:09
Это похоже на проблему с использованиемlm в функциях сweights видеть:stackoverflow.com/questions/38683076/...
 G. Grothendieck20 дек. 2017 г., 16:22
Я вновь открыл это, хотя вопрос задавался раньше, так как ответ здесь лучше, чем любой из ответов на исходный вопрос.stackoverflow.com/questions/33479862/...
 G. Grothendieck20 дек. 2017 г., 16:43
Еще один предмет. Проверенный ответ лучше всего объясняет это, но ответ, который, к сожалению, был удален его автором, кажется мне предпочтительным обходным путем, и было бы неплохо, если бы автор этого ответа отменил удаление.
 Sotos20 дек. 2017 г., 16:25
@ G.Grothendieck Не правда ли, более ценно, чтобы оба вопроса были связаны друг с другом посредством дублирования? Может быть, обмануть другого этим?

Ответы на вопрос(2)

Решение Вопроса

lapply:

По историческим причинам вызовы, созданные lapply, не оценены, и был написан код (например, bquote), который опирается на это. Это означает, что записанный вызов всегда имеет форму FUN (X [[i]], ...), где i заменяется текущим (целым или двойным) индексом. Обычно это не проблема, но это может быть, если FUN использует sys.call или match.call или если это примитивная функция, которая использует вызов. Это означает, что часто безопаснее вызывать примитивные функции с помощью обертки, например, Параметр lapply (ll, function (x) is.numeric (x)) необходим для обеспечения правильной отправки метода для is.numeric.

lm использованияmatch.call дважды в первых строках:

cl <- match.call()
mf <- match.call(expand.dots = FALSE)

Решение, отмеченное в файле справки и @Florian, заключается в использовании анонимной функции-оболочки.

Обновить

Заэто конкретная проблема изменения формулы модели, вы можете переписать, чтобы избежать вызоваlm в пределахlapply используяupdate вместо:

# create base model (the formula here doesn't really matter, but we can specify the weights safely here)
baselm <- lm(y+x1,data=dd,weights=dd[,"wg"])
# update with lapply
lapply(ls.form,update,object=baselm)
[[1]]

Call:
lm(formula = y ~ x1 + x2, data = dd, weights = dd[, "wg"])

Coefficients:
(Intercept)           x1           x2  
    0.07561      0.16111      0.15014  

...
 Bastien20 дек. 2017 г., 16:31
Наконец, ваше решение подходит для этого вопроса, однако оно не решает мою проблему (я думаю, что оно просто переместило проблему в другое место ...) Так что я принял ваш ответ, но задаю дополнительный вопрос там:stackoverflow.com/questions/47909470/...
 Bastien20 дек. 2017 г., 15:54
Интересно, мне придется смешать весь мой код, но я попробую. Я дам вам знать, как это получилось.

почему это не работает, но я думаю, у меня есть решение для вас:

res.with.wg2 <- lapply(ls.form, 
                   function(x) {lm(formula = x, data=dd, weights=dd[,"wg"])})

Надеюсь это поможет!

 Florian20 дек. 2017 г., 15:22
Привет @Bastien, извините за удаление комментария. Я удалил его, потому что не был уверен, что это была настоящая проблема (под этим ответом была длинная ветка комментариев), особенно когда я читал ответ @James ниже. Я все еще пытаюсь понять проблему, но боюсь, что она немного выше моей головы. Что меня действительно смущает, так это то, чтоres.with.wg <- lapply(X=ls.form, FUN=lm, data = dd, method= 'model.frame') работает правильно.
 Florian20 дек. 2017 г., 15:33
Для любопытных этоЭта проблема, Он содержит ответ почти точно так же, как мой ...
 James20 дек. 2017 г., 15:45
@Bastien, для вашей проблемы лучше создать базовую модель, а затем использоватьupdate создавать новые с разными формулами.
 Bastien20 дек. 2017 г., 15:20
Вы не должны были удалять свой комментарий на мой вопрос, ссылка, которую вы предоставили, была полезной
 Bastien20 дек. 2017 г., 15:38
К сожалению, это решение не работает (пока) для меня ... так как моя проблема на один уровень глубже ... Моя проблема в функции ... делая этот пример более точным:f1 <- function(samp, dat, wgt){ res.with.wg2 <- lapply(ls.form, function(x) {lm(formula = x, data=dat[samp,], weights=dat[samp,wgt])}) } чем звонить сf1(1:66, dat=dd, wgt = "wg"), Все еще ищу исправление, но это похоже на глубокую проблему! Должен ли я изменить свой вопрос или начать новый?

Ваш ответ на вопрос