В R подгонка одной и той же модели к широкоформатным и длинным (аккуратным) фреймам данных формата с помощью функции lm ()

#r #tidyverse #lm #long-format-data #wide-format-data

Вопрос:

Я работаю над общедоступным набором данных ‘FEV.dat’ на этой странице (необработанные данные здесь) и пытаюсь подогнать линейную модель. Я могу сделать это без проблем, когда данные в широком формате, но как только я помещаю их в длинный формат, я не знаю, как подогнать ту же модель.

Вот мой код:

 library(tidyverse)

fev <- read.table("FEV.dat", header=T)
 
 > head(fev)
  patient base fev1 fev2 fev3 fev4 fev5 fev6 fev7 fev8 drug
1       1 2.46 2.68 2.76 2.50 2.30 2.14 2.40 2.33 2.20    a
2       2 3.50 3.95 3.65 2.93 2.53 3.04 3.37 3.14 2.62    a
3       3 1.96 2.28 2.34 2.29 2.43 2.06 2.18 2.28 2.29    a
4       4 3.44 4.08 3.87 3.79 3.30 3.80 3.24 2.98 2.91    a
5       5 2.80 4.09 3.90 3.54 3.35 3.15 3.23 3.46 3.27    a
6       6 2.36 3.79 3.97 3.78 3.69 3.31 2.83 2.72 3.00    a
 
 # fit a simple model using the variable 'base' to predict the variable 'fev1'
fit.base <- lm(fev1 ~ 1   base, data=fev)
 

Теперь я помещаю набор данных в длинный формат и делаю его аккуратным
фреймом данных (возможно, не самым эффективным способом, поскольку я новичок в R). Поэтому
переменные ‘base’, ‘fev1’, ‘fev2’ … ‘fev8’ теперь являются уровнями фактора ‘time’:

 fev_long <- fev %>% 
    pivot_longer(
     base:fev8,
     names_to="time",
     values_to="score"
    )

fev_tidy <- as_tibble(fev_long)
fev_tidy$drug <- as.factor(fev_tidy$drug)
fev_tidy$time <- as.factor(fev_tidy$time)
 
 > fev_tidy
# A tibble: 648 x 4
   patient drug  time  score
     <int> <fct> <fct> <dbl>
 1       1 a     base   2.46
 2       1 a     fev1   2.68
 3       1 a     fev2   2.76
 4       1 a     fev3   2.5
 5       1 a     fev4   2.3
 6       1 a     fev5   2.14
 7       1 a     fev6   2.4
 8       1 a     fev7   2.33
 9       1 a     fev8   2.2
10       2 a     base   3.5
# … with 638 more rows
 

Что я хочу знать, так это как использовать оценки, соответствующие «базовому» уровню
фактора «время», чтобы предсказать оценки, соответствующие уровню «офв1
» фактора «время», теперь, когда данные в длинном (и аккуратном) формате?

Я безуспешно пробовал несколько вещей и не могу найти ответ в Google. Пока я могу выполнять анализ с данными в широком формате.

Комментарии:

1. В этом случае вам нужен широкоформатный формат. В противном случае вы будете выполнять: fit.base <-lm(fev_tidy[time == «fev1»] $score ~ 1 fev_tidy[time == «base»] $score)

2. @BrianMontgomery Ах, хорошо, это помогает — я прочитал больше о аккуратных данных и узнал, что только потому, что данные в широком формате, не обязательно означает, что они не в аккуратном формате. Правильно ли я понимаю, что данные уже были в аккуратном формате до того, как я их удлинил? (Я обновил вопрос, чтобы не путать других с неверными утверждениями о том, что было широким, длинным и аккуратным)

3. Да. Точно. Данные уже были аккуратными и, следовательно, в наилучшей форме для анализа.

4. @BrianMontgomery Большое спасибо, что дали мне знать! Если вы хотите включить эти комментарии в ответ, я приму и поддержу.