#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 Большое спасибо, что дали мне знать! Если вы хотите включить эти комментарии в ответ, я приму и поддержу.