2016-12-20 16 views
0

Я использую пакет nlme для изучения многоуровневых моделей и следующих примеров из учебника «Обнаружение статистики с использованием R», когда это произошло.Ошибка при использовании nlme; malformed factor

Mixed Models Code

Набор данных Honeymoon Period.dat, также можно загрузить под их веб-компаньона.

Data Set - Multilevel Models

require(nlme) 
require(reshape2) 
satisfactionData = read.delim("Honeymoon Period.dat", header = TRUE) 

restructuredData<-melt(satisfactionData, id = c("Person", "Gender"), measured = c("Satisfaction_Base", "Satisfaction_6_Months", "Satisfaction_12_Months", "Satisfaction_18_Months")) 
names(restructuredData)<-c("Person", "Gender", "Time", "Life_Satisfaction") 


#print(restructuredData) 
#restructuredData.sorted<-restructuredData[order(Person),] 

intercept <-gls(Life_Satisfaction~1, data = restructuredData, method = "ML", na.action = na.exclude) 
randomIntercept <-lme(Life_Satisfaction ~1, data = restructuredData, random = ~1|Person, method = "ML", na.action = na.exclude, control = list(opt="optim")) 
anova(intercept, randomIntercept) 

timeRI<-update(randomIntercept, .~. + Time) 
timeRS<-update(timeRI, random = ~Time|Person) 
ARModel<-update(timeRS, correlation = corAR1(0, form = ~Time|Person)) 

Ошибка произошла в этот момент, когда я пытаюсь обновить «Таймеры» модель. Ошибка заключается в следующем:

Error in as.character.factor(X[[i]], ...) : malformed factor 

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

ответ

3

Я рассмотрел эту книгу. Похоже, что кодирование неверно. Ошибка, которую вы получаете, заключается в том, что ваша временная переменная является фактором, и вам нужно, чтобы она была числовой. В первой фигуре автора в книге он представляет время как числовое (0 - 3), но его код для моделей неверен. Я перекодировано это для вас:

## First, Time needs to be recoded as a numeric 

restructuredData$Time.Numeric <- with(restructuredData, ifelse(Time == "Satisfaction_Base", 0, 
     ifelse(Time == "Satisfaction_6_Months", 1, 
     ifelse(Time == "Satisfaction_12_Months", 2, 
     ifelse(Time == "Satisfaction_18_Months", 3, NA))))) 

## Baseline Model 

intercept <-gls(Life_Satisfaction~1, data = restructuredData, method = "ML", na.action = na.exclude) 

summary(intercept) 

## Model where intercept can vary for Individuals 

randomIntercept <- lme(Life_Satisfaction ~ 1, data = restructuredData, random = ~1|Person, method = "ML", na.action = na.exclude, control = list(opt = "optim")) 

summary(randomIntercept) 

## Add time as a fixed effect 

timeRI <- lme(Life_Satisfaction ~ Time.Numeric, data = restructuredData, random = ~1|Person, method = "ML", na.action = na.exclude, control = list(opt = "optim")) 

summary(timeRI) 

## Add a random slope to the model by nesting the Individual within the test time 

timeRS <- lme(Life_Satisfaction ~ Time.Numeric, data = restructuredData, random = ~Time.Numeric|Person, method = "ML", na.action = na.exclude, control = list(opt = "optim")) 

summary(timeRS) 


## Modeling the covariance structure structure of the errors with a first-order autoregressive covariance structure 

ARModel <- update(timeRS, correlation = corAR1(0, form = ~Time.Numeric|Person)) 

summary(ARModel) 

anova(intercept, randomIntercept, timeRI, timeRS, ARModel) 

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

+1

Хороший совет! Я немного упростил это: «changeduredData [,« Time »] <- as.numeric (реорганизованныйData [,« Time »]) - 1' Это может быть выполнено до первого определения модели:' intercept <-gls (Life_Satisfaction ~ 1 , data = реорганизованнаяДата, метод = "ML", na.action = na.exclude) 'И чем остальной код не нужно менять. –