Продолжайте получать ошибку в model.frame.default (Термины, newdata, na.action = na.action, xlev = object $ xlevels): factor subj имеет новые уровни - PullRequest
0 голосов
/ 08 мая 2020

example of my data

Я пытаюсь сделать линейную регрессию на основе данных часов. Я все время получаю ошибку, что у моего фактора subj новые уровни.

Я новичок в r, поэтому прошу прощения, если сделал очевидные ошибки! Заранее спасибо. Я действительно потерян и в отчаянии.

Вот код, который я использовал для этого. Dat - это то, что называется моим именем фрейма данных, а commons and techs относится к другим столбцам, которые похожи на CloseFriendsG1.

commons<-grep("^C",rownames(dat),value=TRUE)
type_q=rep("Common",dim(dat)[1])
type_q[techs]="Technical"
dat$totals<-rowSums(dat[,techs])+rowSums(dat[,commons])
head(dat)
set.seed(2016)
Train=sample(1:156,110,replace=FALSE)
ModTrain<-lm(totals~.,data=dat[Train,])
ModTest<-predict(ModTrain,newdata=dat[-Train,])``

1 Ответ

1 голос
/ 08 мая 2020

Чтобы добавить небольшое объяснение, ваш столбец id, скорее всего, является уникальной записью, и когда вы делаете totals~., вы регрессируете по всем столбцам, кроме totals. Если на каждый фактор id приходится только одно наблюдение, его нельзя оценить, и регрессия ... полная чушь:

da = data.frame(id=factor(1:10),x=runif(10),y=runif(10),z=runif(10))
trn = 1:5
mod = lm(y ~ .,data=da[trn,])

summary(mod)

Call:
lm(formula = y ~ ., data = da[trn, ])

Residuals:
ALL 5 residuals are 0: no residual degrees of freedom!

Coefficients: (2 not defined because of singularities)
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  0.48208         NA      NA       NA
id2          0.11749         NA      NA       NA
id3          0.01146         NA      NA       NA
id4         -0.29586         NA      NA       NA
id5          0.34529         NA      NA       NA
x                 NA         NA      NA       NA
z                 NA         NA      NA       NA

Вы можете удалить его при подборе модели:

mod = lm(y ~ .,data=da[trn,-1])
predict(mod,da[-trn,])
        6         7         8         9        10 
0.2992070 1.2727160 0.7789787 0.6585381 0.4227041 

Для вашего примера используйте lm(totals~.,data=dat[Train,-1]) или lm(totals~.,data=dat[Train,!grepl("subj",colname(dat))]). не имеет значения, находится ли идентификатор в data.frame для прогнозирования.

...