lm () прерывается при использовании poly () с предикторами, установленными как факторы - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь смоделировать связь между категориальной предикторной переменной и непрерывной переменной результата. Я использую lm() для этой цели. Поскольку это категориальная переменная, надлежащей практикой является преобразование ее в тип факторной переменной. Однако при использовании poly() для регрессионного члена предиктора и при установке переменной предиктора в качестве фактора это приводит к разрыву lm(). С другой стороны, если я запускаю lm() без использования poly() (но сохраняю предиктор как фактор) или сохраняю poly(), но не преобразую предиктор в фактор (пусть это будет число *) 1054 *) - тогда lm() не ломается. Я не понимаю, почему это ломается, и я не понимаю, могу ли я доверять результатам, когда они не ломаются.

Данные

Данные о 50 баскетболистах. Один столбец (PosCode) - это положение игрока в игре, а другой (Height) - рост игрока.

data <-
structure(list(Player = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 
28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 
44, 45, 46, 47, 48, 49, 50), PosCode = c(3, 3, 4, 1, 4, 1, 3, 
1, 2, 2, 4, 1, 5, 5, 2, 1, 2, 5, 4, 4, 5, 4, 4, 4, 2, 3, 2, 3, 
1, 1, 2, 4, 1, 2, 3, 1, 5, 4, 3, 4, 4, 1, 1, 4, 5, 1, 1, 1, 5, 
2), Height = c(176.1, 179.1, 183.1, 169.7, 177.3, 179, 176.4, 
174.9, 180.2, 176.5, 178.6, 167.9, 183.4, 166.2, 189.5, 171.9, 
188.5, 172.6, 167.7, 172.6, 186.9, 163.8, 179.3, 165.4, 182.2, 
166.1, 176.8, 171.9, 173.8, 163, 172.5, 184.9, 170.4, 170.6, 
166.8, 172.6, 184.3, 163.3, 182.4, 165.8, 173.4, 182.1, 172.9, 
184.9, 173.2, 185.8, 161.4, 186, 178.4, 170.7)), row.names = c(NA, 
-50L), class = c("tbl_df", "tbl", "data.frame"))


> data
## # A tibble: 50 x 3
##    Player PosCode Height
##    <dbl>   <dbl>  <dbl>
##  1      1       3   176.
##  2      2       3   179.
##  3      3       4   183.
##  4      4       1   170.
##  5      5       4   177.
##  6      6       1   179 
##  7      7       3   176.
##  8      8       1   175.
##  9      9       2   180.
## 10     10       2   176.
## # ... with 40 more rows

Моделирование данных

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

library(tidyverse)
library(magrittr) 

data %<>% mutate_at(vars(PosCode), ~ as.factor(.)) ## convert PosCode from dbl to fct

Моделирование с использованием lm() без poly()

lm(Height ~ PosCode, data = data)

## Call:
## lm(formula = Height ~ PosCode, data = data)
## 
## Coefficients:
## (Intercept)     PosCode2     PosCode3     PosCode4     PosCode5  
##    173.6714       4.9397       0.4429       0.1824       4.1857  

Моделирование с использованием lm() с poly()

lm(Height ~ poly(PosCode ,1), data = data)

## Error in qr.default(X) : NA/NaN/Inf in foreign function call (arg 1)
## In addition: Warning messages:
## 1: In mean.default(x) : argument is not numeric or logical: returning NA
## 2: In Ops.factor(x, xbar) : ‘-’ not meaningful for factors

Если предиктор не является фактором, нет проблем независимо от poly()

## convert PosCode from fct back to dbl
data %<>% mutate_at(vars(PosCode), ~ as.double(.)) 

## lm() without poly()
lm(Height ~ PosCode, data = data)

Call:
lm(formula = Height ~ PosCode, data = data)

## Coefficients:
## (Intercept)      PosCode  
##   174.3848       0.3112 


## lm() with poly() 
lm(Height ~ poly(PosCode ,1), data = data)

## Call:
## lm(formula = Height ~ poly(PosCode, 1), data = data)

## Coefficients:
##      (Intercept)  poly(PosCode, 1)  
##          175.256             3.173 

Но ясно, что трактовка PosCode как dbl вместо fct меняет модель так, что это неправильно.

Итог

Я не понимаю, почему включение poly() в lm() нарушает его, когда предиктор установлен как фактор-переменная.

1 Ответ

2 голосов
/ 24 апреля 2020

С help("poly"):

x a цифра c вектор, в котором нужно вычислить полином.

Таким образом, Вы не можете использовать факторы внутри poly(). Это ожидается, потому что категориальные переменные (то есть факторы) должны быть перекодированы, например, в фиктивные переменные. И не имеет смысла, скажем, иметь эффект квадратичного c для категориальной переменной в целом и для закодированных (фиктивных) переменных. (Это не имеет смысла с точки зрения существа, но возведение в квадрат фиктивной переменной, которая имеет только 0 и 1, также не имеет большого смысла с точки зрения статистики, слепой с точки зрения.)

Вы можете видеть, что lm() перекодирует ваш фактор, потому что вы получаете четыре коэффициента (на один меньше, чем количество категорий) для переменной PosCode в вашей первой модели.

В конце концов, poly() не очень полезен, если вы не установите его аргумент degree до значения> 1

...