Почему я не могу предсказать одно значение MPG, заданное одним значением лошадиных сил, с помощью функции R предиката ()? - PullRequest
0 голосов
/ 18 ноября 2018

Использование набора данных ISLR Auto и следующего кода:

lm.fit <- lm(Auto$mpg ~ Auto$horsepower)
predict(lm.fit, newdata = data.frame(horsepower=100))
predict(lm.fit, data.frame(horsepower=(c(100))), interval="confidence")

Я получаю сообщения об ошибках вроде:

Предупреждающее сообщение: 'newdata' имеет 1 строку, но найденные переменные имеют 392 строки

Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Основная причина, по которой вы не должны использовать что-то вроде lm(data$y ~ data$whatever), заключается в том, что здесь хранится жестко запрограммированная ссылка на столбцы в вашем наборе обучающих данных.Вместо того чтобы использовать набор данных Auto, давайте использовать набор данных mtcars, поставляемый в качестве примера в качестве примера.

Давайте подгоним модель неверным способом:

m <- lm(mtcars$mpg ~ mtcars$wt)

После этого модель *Компонент 1007 * теперь относится конкретно к mtcars$mpg и mtcars$wt, а не к переменным mpg и wt:

m$terms
# mtcars$mpg ~ mtcars$wt
# attr(,"variables")
# list(mtcars$mpg, mtcars$wt)
# attr(,"factors")
#            mtcars$wt
# mtcars$mpg         0
# mtcars$wt          1
# ...

Теперь попробуйте предсказать, используя эту модель:

predict(m, newdata=data.frame(wt=4))
#         1         2         3         4         5         6         7         8         9        10        11        12        13 
# 23.282611 21.919770 24.885952 20.102650 18.900144 18.793255 18.205363 20.236262 20.450041 18.900144 18.900144 15.533127 17.350247 
#        14        15        16        17        18        19        20        21        22        23        24        25        26 
# 17.083024  9.226650  8.296712  8.718926 25.527289 28.653805 27.478021 24.111004 18.472586 18.926866 16.762355 16.735633 26.943574 
#        27        28        29        30        31        32 
# 25.847957 29.198941 20.343151 22.480940 18.205363 22.427495 
# Warning message:
# 'newdata' had 1 row but variables found have 32 rows 

Что случилось?Вместо поиска переменной с именем wt метод predict ищет что-то с именем mtcars$wt.В вашем newdata нет ничего подобного, поэтому в качестве запасного варианта он выглядит в глобальной среде (технически он пытается сначала вычислить выражение mtcars$wt в среде newdata, а затем в среде, гдебыла установлена ​​модель, которая является глобальной средой).Это успешно выполняется и фактически разрешается в исходный столбец данных, который мы использовали для соответствия модели.Из-за этого аргумент newdata по существу игнорируется.

Теперь, если мы подгоним модель правильным образом с помощью

m2 <- lm(mpg ~ wt, data=mtcars)

Это сохранит имена переменных mpg и wt в модели, а поиск по названию будет работать как задумано:

predict(m2, newdata=data.frame(wt=4))
#        1 
# 15.90724 
0 голосов
/ 18 ноября 2018

Я понятия не имею, почему это не получается:

lm.fit <- lm(Auto$mpg ~ Auto$horsepower)
predict(lm.fit, newdata = data.frame(horsepower=100))

, но стандартный способ сделать это - дать формулу с точки зрения данных и включить данные в качестве аргумента:

lm.fit <- lm(mpg ~ horsepower, data=Auto)
predict(lm.fit, newdata=data.frame(horsepower=100))

должно работать.У меня нет этого набора данных, поэтому вот он на крошечном примере:

> x=runif(100)
> y=runif(100)
> d = data.frame(x=x,y=y)
> m = lm(y~x, data=d)
> predict(m, newdata=data.frame(x=10))
       1 
0.454481 

Но сделайте это так, и случатся плохие вещи:

> m2 = lm(d$y~d$x)
> predict(m2, newdata=data.frame(x=10))
        1         2         3         4         5         6         7         8 
0.4699471 0.4686431 0.4687603 0.4691200 0
...