Regressão linear com medidas repetidas em R

12

Não consegui descobrir como executar a regressão linear em R in para um design de medida repetida. Em uma pergunta anterior (ainda sem resposta), me foi sugerido não usar, lmmas usar modelos mistos. Eu usei lmda seguinte maneira:

lm.velocity_vs_Velocity_response <- lm(Velocity_response~Velocity*Subject, data=mydata)

(mais detalhes sobre o conjunto de dados podem ser encontrados no link acima)

No entanto, não consegui encontrar na internet nenhum exemplo com o código R mostrando como executar uma análise de regressão linear.

O que eu quero é por um lado uma parcela dos dados com a linha de ajuste dos dados, e, por outro lado, o valor juntamente com o valor-p para o teste de significância para o modelo.R2

Existe alguém que possa fornecer algumas sugestões? Qualquer exemplo de código R pode ser de grande ajuda.


Editar
De acordo com a sugestão que recebi até agora, a solução para analisar meus dados para entender se existe uma relação linear entre as duas variáveis ​​Velocity_response (derivada do questionário) e Velocity (derivada do desempenho) deve ser esta:

library(nlme)
summary(lme(Velocity_response ~ Velocity*Subject, data=scrd, random= ~1|Subject))

O resultado do resumo fornece isso:

    > summary(lme(Velocity_response ~ Velocity*Subject, data=scrd, random= ~1|Subject))
    Linear mixed-effects model fit by REML
     Data: scrd 
           AIC      BIC   logLik
      104.2542 126.1603 -30.1271

    Random effects:
     Formula: ~1 | Subject
            (Intercept) Residual
    StdDev:    2.833804 2.125353

Fixed effects: Velocity_response ~ Velocity * Subject 
                              Value Std.Error DF    t-value p-value
(Intercept)               -26.99558  25.82249 20 -1.0454288  0.3083
Velocity                   24.52675  19.28159 20  1.2720292  0.2180
SubjectSubject10           21.69377  27.18904  0  0.7978865     NaN
SubjectSubject11           11.31468  33.51749  0  0.3375754     NaN
SubjectSubject13           52.45966  53.96342  0  0.9721337     NaN
SubjectSubject2           -14.90571  34.16940  0 -0.4362299     NaN
SubjectSubject3            26.65853  29.41574  0  0.9062674     NaN
SubjectSubject6            37.28252  50.06033  0  0.7447517     NaN
SubjectSubject7            12.66581  26.58159  0  0.4764880     NaN
SubjectSubject8            14.28029  31.88142  0  0.4479188     NaN
SubjectSubject9             5.65504  34.54357  0  0.1637076     NaN
Velocity:SubjectSubject10 -11.89464  21.07070 20 -0.5645111  0.5787
Velocity:SubjectSubject11  -5.22544  27.68192 20 -0.1887672  0.8522
Velocity:SubjectSubject13 -41.06777  44.43318 20 -0.9242591  0.3664
Velocity:SubjectSubject2   11.53397  25.41780 20  0.4537754  0.6549
Velocity:SubjectSubject3  -19.47392  23.26966 20 -0.8368804  0.4125
Velocity:SubjectSubject6  -29.60138  41.47500 20 -0.7137162  0.4836
Velocity:SubjectSubject7   -6.85539  19.92271 20 -0.3440992  0.7344
Velocity:SubjectSubject8  -12.51390  22.54724 20 -0.5550080  0.5850
Velocity:SubjectSubject9   -2.22888  27.49938 20 -0.0810519  0.9362
 Correlation: 
                          (Intr) Velcty SbjS10 SbjS11 SbjS13 SbjcS2 SbjcS3 SbjcS6 SbjcS7 SbjcS8 SbjcS9 V:SS10 V:SS11 V:SS13 Vl:SS2 Vl:SS3
Velocity                  -0.993                                                                                                         
SubjectSubject10          -0.950  0.943                                                                                                  
SubjectSubject11          -0.770  0.765  0.732                                                                                           
SubjectSubject13          -0.479  0.475  0.454  0.369                                                                                    
SubjectSubject2           -0.756  0.751  0.718  0.582  0.362                                                                             
SubjectSubject3           -0.878  0.872  0.834  0.676  0.420  0.663                                                                      
SubjectSubject6           -0.516  0.512  0.490  0.397  0.247  0.390  0.453                                                               
SubjectSubject7           -0.971  0.965  0.923  0.748  0.465  0.734  0.853  0.501                                                        
SubjectSubject8           -0.810  0.804  0.769  0.624  0.388  0.612  0.711  0.418  0.787                                                 
SubjectSubject9           -0.748  0.742  0.710  0.576  0.358  0.565  0.656  0.386  0.726  0.605                                          
Velocity:SubjectSubject10  0.909 -0.915 -0.981 -0.700 -0.435 -0.687 -0.798 -0.469 -0.883 -0.736 -0.679                                   
Velocity:SubjectSubject11  0.692 -0.697 -0.657 -0.986 -0.331 -0.523 -0.607 -0.357 -0.672 -0.560 -0.517  0.637                            
Velocity:SubjectSubject13  0.431 -0.434 -0.409 -0.332 -0.996 -0.326 -0.378 -0.222 -0.419 -0.349 -0.322  0.397  0.302                     
Velocity:SubjectSubject2   0.753 -0.759 -0.715 -0.580 -0.360 -0.992 -0.661 -0.389 -0.732 -0.610 -0.563  0.694  0.528  0.329              
Velocity:SubjectSubject3   0.823 -0.829 -0.782 -0.634 -0.394 -0.622 -0.984 -0.424 -0.799 -0.667 -0.615  0.758  0.577  0.360  0.629       
Velocity:SubjectSubject6   0.462 -0.465 -0.438 -0.356 -0.221 -0.349 -0.405 -0.995 -0.449 -0.374 -0.345  0.425  0.324  0.202  0.353  0.385
Velocity:SubjectSubject7   0.961 -0.968 -0.913 -0.740 -0.460 -0.726 -0.844 -0.496 -0.986 -0.778 -0.718  0.886  0.674  0.420  0.734  0.802
Velocity:SubjectSubject8   0.849 -0.855 -0.807 -0.654 -0.406 -0.642 -0.746 -0.438 -0.825 -0.988 -0.635  0.783  0.596  0.371  0.649  0.709
Velocity:SubjectSubject9   0.696 -0.701 -0.661 -0.536 -0.333 -0.526 -0.611 -0.359 -0.676 -0.564 -0.990  0.642  0.488  0.304  0.532  0.581
                          Vl:SS6 Vl:SS7 Vl:SS8
Velocity                                      
SubjectSubject10                              
SubjectSubject11                              
SubjectSubject13                              
SubjectSubject2                               
SubjectSubject3                               
SubjectSubject6                               
SubjectSubject7                               
SubjectSubject8                               
SubjectSubject9                               
Velocity:SubjectSubject10                     
Velocity:SubjectSubject11                     
Velocity:SubjectSubject13                     
Velocity:SubjectSubject2                      
Velocity:SubjectSubject3                      
Velocity:SubjectSubject6                      
Velocity:SubjectSubject7   0.450              
Velocity:SubjectSubject8   0.398  0.828       
Velocity:SubjectSubject9   0.326  0.679  0.600

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-1.47194581 -0.46509026 -0.05537193  0.39069634  1.89436646 

Number of Observations: 40
Number of Groups: 10 
Warning message:
In pt(q, df, lower.tail, log.p) : NaNs produced
> 

Agora, eu não entendo onde posso obter o R ​​^ 2 e os valores p correspondentes, indicando-me se existe ou não uma relação linear entre as duas variáveis, nem entendo como meus dados podem ser plotados com a linha que se ajusta ao regressão.

Alguém pode ser tão gentil em me esclarecer? Eu realmente preciso da sua ajuda pessoal ...

L_T
fonte
"Modelos de efeitos mistos e extensões em ecologia com R", de Zuur et al. é uma boa introdução aos modelos lineares de efeitos mistos, que se concentram menos na teoria e mais na aplicação da metodologia.
Roland
Caro Roland, acredito que esse livro é útil, mas estou procurando algo on-line ... você tem alguma página para sugerir?
L_T
1
Como eu disse no seu post anterior, lm () tem um gráfico associado a ele. Portanto, se seu modelo for M1, você pode usar plot (M1).
Peter Flom - Restabelece Monica
Caro @ PeterFlom, sim, mas você também me disse para evitar o uso do lm para o design de medidas repetidas. Portanto, minha pergunta é se eu tenho que usar lm para analisar meus dados ou outra função. Alguma sugestão?
L_T
1
Como eu disse, olhe para modelos de vários níveis. Em R, você pode olhar para o nlmepacote. Além disso, procure neste site o tópico, há muito escrito sobre isso aqui.
Peter Flom - Restabelece Monica

Respostas:

17

O que você faz realmente depende dos objetivos da análise. Não sei exatamente quais são os objetivos da sua análise, mas analisarei vários exemplos e espero que um deles seja aplicável à sua situação.

Caso 1 : Uma variável quantitativa medida duas vezes

Digamos que você tenha realizado um estudo com seres humanos no qual os participantes fizeram um teste estatístico duas vezes e desejou descobrir se as pontuações médias na segunda medição eram diferentes da primeira (para determinar se o aprendizado ocorreu). Se as pontuações test1 e test2 estiverem armazenadas no quadro de dados d, você poderá fazer isso inteiramente usando a função lm (), como em:

mod <- lm(test2 - test1 ~ 1, data = d)
summary(mod)

O teste da interceptação é o teste da diferença entre test1 e test2. Observe que você não terá delta-R ^ 2 para a diferença entre test1 e test2 - em vez disso, sua medida do tamanho do efeito deve ser algo como o d de cohen.

Caso 2a : Uma variável quantitativa medida duas vezes, uma variável dicotômica, medida totalmente entre indivíduos

Digamos que tenhamos o mesmo desenho de estudo, mas queremos saber se ocorreram diferentes taxas de aprendizado para homens e mulheres. Portanto, temos uma variável quantitativa (desempenho do teste) que é medida duas vezes e uma variável dicotômica, medida uma vez. Supondo que test1, test2 e sexo estão todos contidos no quadro de dados d, também poderíamos testar este modelo usando apenas lm (), como em:

mod <- lm(test2 - test1 ~ gender, data = d)
summary(mod)
lm.sumSquares(mod) # lm.sumSquares() is located in the lmSupport package, and gives the change in R^2 due to the between-subjects part of the model

Supondo que o gênero esteja centrado (isto é, codificado, por exemplo, masculino = -5,5 e feminino = +,5), a interceptação nesse modelo é o teste da diferença entre o teste 1 e o teste 2, em média entre homens e mulheres. O coeficiente para gênero é a interação entre tempo e gênero. Para obter o efeito de gênero, calculado em média ao longo do tempo, você teria que fazer:

mod <- lm(rowMeans(cbind(test2, test1)) ~ gender, data = d)
summary(mod)

Caso 2b : Uma variável quantitativa medida duas vezes, uma variável quantitativa, medida apenas uma vez

Vamos supor que novamente tenhamos uma variável quantitativa medida duas vezes e uma variável quantitativa medida uma vez. Então, por exemplo, digamos que tínhamos uma medida do interesse da linha de base nas estatísticas e queríamos determinar se as pessoas que tinham níveis mais altos de interesse da linha de base aprendiam mais do tempo 1 ao tempo 2. Primeiro, teríamos que centralizar o interesse, como em :

d$interestc <- d$interest - mean(d$interest)

Supondo que test1, test2 e interestc estejam todos no quadro de dados d, essa questão poderia ser testada de maneira muito semelhante ao caso 1a:

mod <- lm(test2 - test1 ~ interestc, data = d)
summary(mod)
lm.sumSquares(mod)

Mais uma vez, a interceptação nesse modelo testa se, em média entre os juros, as pontuações dos testes foram alteradas do tempo 1 para o tempo 2. No entanto, essa interpretação é válida apenas quando o interesse é centrado. O coeficiente de interesse é se o efeito do tempo depende do interesse da linha de base. Poderíamos obter o efeito do interesse, calculado a média ao longo do tempo, calculando a média dos testes 1 e 2, como acima, e testando o efeito do interesse nessa variável composta.

Caso 2c : Uma variável quantitativa medida duas vezes, uma variável categórica, medida apenas uma vez

Vamos supor que sua variável entre sujeitos fosse uma categoria, medida apenas uma vez. Então, por exemplo, vamos supor que você estava interessado em saber se pessoas de diferentes raças (brancas x asiáticas x negras x hispânicas) tinham quantidades diferentes de aprendizado de tempos em tempos 1 a 2. 2. Supondo que teste1, teste2 e raça estão no quadro de dados d , primeiro você precisa contrastar a corrida de código. Isso pode ser feito usando contrastes ortogonais planejados, códigos fictícios ou códigos de efeitos, dependendo das hipóteses / perguntas específicas que você deseja testar (recomendo consultar lm.setContrasts () se estiver procurando uma função auxiliar para fazer isso) . Supondo que a variável race já esteja com código de contraste, você usaria lm () de maneira muito semelhante aos dois casos acima, como em:

mod <- lm(test2 - test1 ~ race, data = d)
summary(mod)
lm.sumSquares(mod)

Supondo que os contrastes raciais estejam centralizados, a interceptação nesse modelo é, mais uma vez, o "efeito principal" do tempo. Os coeficientes para os contrastes raciais são as interações entre esses contrastes e o tempo. Para obter os efeitos omnibus da corrida, use o seguinte código:

Anova(mod, type = 3)

Caso 3 : Uma variável quantitativa medida 3 vezes (isto é, uma manipulação interna de três níveis)

Vamos supor que você tenha adicionado um terceiro ponto de medida ao design do caso um. Portanto, seus participantes fizeram um teste de estatística três vezes em vez de duas. Aqui você tem algumas opções, dependendo se você deseja um teste abrangente das diferenças entre os períodos de tempo (às vezes não).

Por exemplo, digamos que sua hipótese principal seja que as pontuações dos testes aumentem linearmente de tempos em tempos 1 a 3. Supondo que test1, test2 e test3 estejam no quadro de dados d, essa hipótese pode ser testada criando primeiro o seguinte composto:

d$lin <- d[, paste("test", sep = "", 1:3)] %*% c(-1, 0, 1)

Em seguida, você testaria se um modelo de interceptação apenas usando lin como variável dependente possui uma interceptação diferente de 0, como em:

mod <- lm(lin ~ 1, data = d)
summary(mod)

Isso permitirá que você teste se as pontuações das estatísticas aumentaram ao longo do tempo. Obviamente, você pode criar outros tipos de pontuações de diferenças personalizadas, dependendo de suas hipóteses particulares.

Se você se preocupa com os testes omnibus de significância, precisa usar a função Anova () do pacote veicular. A implementação específica é um pouco complicada. Basicamente, você especifica quais variáveis ​​estão dentro dos assuntos e quais são entre assuntos usando lm (). Em seguida, você cria a parte dentro dos assuntos do modelo (ou seja, especifica qual teste1, teste2 e teste3 foram medidos primeiro, segundo e terceiro) e depois passa esse modelo para Anova () criando um quadro de dados chamado idata. Usando meu exemplo hipotético:

mod <- lm(cbind(test1, test2, test3) ~ 1, data = d) # No between-subjects portion of the model
idata <- data.frame(time = c("time1", "time2", "time3")) # Specify the within-subjects portion of the model
mod.A <- Anova(mod, idata = idata, idesign = ~time, type = 3) # Gives multivariate tests.  For univariate tests, add multivariate = FALSE
summary(mod.A)

A instrução idesign diz ao Anova para incluir a variável de tempo (composta de teste1, teste2 e teste3) no modelo. Este código fornecerá seus testes completos dos efeitos do tempo nas pontuações dos testes.

Caso 4 : Uma variável quantitativa medida 3 vezes, uma variável quantitativa entre indivíduos

Este caso é uma extensão simples do Caso 3. Como acima, se você se importa apenas com 1 grau de testes de liberdade, pode simplesmente criar uma pontuação de diferença personalizada com sua variável dentro dos assuntos. Portanto, supondo que teste1, teste2, teste3 e interesse estejam todos no quadro de dados d e supondo que estamos interessados ​​nos efeitos lineares do tempo nas pontuações dos testes (e como esses efeitos do tempo variam com o interesse da linha de base), você faria Os seguintes:

d$lin <- d[, paste("test", sep = "", 1:3)] %*% c(-1, 0, 1)

Em seguida, faça o seguinte (com interesse centrado na média):

mod <- lm(lin ~ interestc, data = d)
summary(mod)
lm.sumSquares(mod)

Se você deseja testes omnibus, faça o seguinte:

mod <- lm(cbind(test1, test2, test3) ~ interest, data = d) # We now have a between-subjects portion of the model
idata <- data.frame(time = c("time1", "time2", "time3"))
mod.A <- Anova(mod, idata = idata, idesign = ~time * interest, type = 3) # The idesign statement assumes that we're interested in the interaction between time and interest
summary(mod.A)

Outros casos: omitirei estes por questões de brevidade, mas são extensões simples do que já descrevi.

Observe que os testes omnibus (univariados) de tempo em que o tempo tem mais de 2 níveis assumem esfericidade. Essa suposição se torna bastante insustentável à medida que você aumenta o número de níveis. Se você tiver alguns pontos de medição em seu design (por exemplo, 4+), recomendo que você use algo como modelagem multinível e mude para um pacote especializado para essa técnica (como nlme ou lme4 .

Espero que isto ajude!

Patrick S. Forscher
fonte
Caro Patrick @ user1188407, muito obrigado por ter sido muito gentil em fornecer essa resposta. Infelizmente meu caso provavelmente se encaixa no que você escreveu nas últimas frases ... então eu precisaria de um exemplo de código R para entender como tratar meus dados. De fato, se você olhar para o design do meu experimento descrito em um post anterior stackoverflow.com/questions/12182373/…, poderá ver que eu tenho uma variável medida 4 vezes (ou seja, a velocidade medida em 4 condições)
L_T
e quero descobrir se existe uma relação linear com uma variável (velocity_response) que expressa a velocidade percebida nas quatro condições. Portanto, cada participante passou por 4 condições e, em seguida, avaliou a percepção dessas condições. Eu quero saber se o desempenho está relacionado com a percepção ...
L_T 03/09/12
Bem, se você quiser usar uma solução de modelagem multinível, poderá usar muitos recursos online diferentes. Para começar, você deve dar uma olhada no pacote nlme e nesta vinheta . A vinheta está um pouco desatualizada (2002), achei útil quando estava aprendendo sobre modelagem em vários níveis. Por fim, você pode conferir o livro publicado pelos criadores do pacote nlme.
Patrick S. Forscher
Caro Patrick @ user1188407 obrigado. Estudei os modelos multiníveis e cheguei a esta fórmula para analisar meus dados: lme (Velocity_response ~ Velocity * Assunto, dados = scrd, aleatório = ~ 1 | Assunto) Você pode me confirmar que esta fórmula está correta para a análise? quer executar em meus dados? No entanto, não entendo como posso obter valores R ^ 2 e p, nem como plotar o gráfico com os pontos e a linha que se ajusta à regressão. Podes ajudar-me, por favor? Eu não sou um statician ...
L_T
A fórmula parece correta para mim com base no meu entendimento do seu estudo (e supondo que você tenha formatado seus dados no formato de período pessoal). Você obteria seus valores-p salvando os resultados de sua análise em um objeto (como eu faço nos meus exemplos) e obtendo um resumo desse objeto. No entanto, devido às diferenças entre os modelos multiníveis e a regressão tradicional (por exemplo, métricas de tamanho de efeito - não há métrica padrão nos modelos multiníveis), sugiro fortemente que você leia mais sobre essa técnica antes de usá-la. Parece que os outros usuários recomendaram várias boas opções.
Patrick S. Forscher 04/04/12