Skip to content

Errors when running pya.pred.predict_age() #10

@hayleywelsh

Description

@hayleywelsh

I have been trying to use the pyaging package through spyder, as it is one of the only packages that includes the Horvath centenarian clocks. I have been following the tutorial available, but keep running into an issue when using pya.pred.predict_age(). I am very new to python, and have only used it one other time. I have included the code I ran and the output it gave, hoping for some troubleshooting advice.
Thank you!

import pandas as pd
import pyaging as pya
betas = pd.read_csv("/Users/hayleywelsh/Desktop/Methyl paper 3/Paper_3_QC/Raw-beta-values-N87-n866895-no-annotation.csv", index_col=0)
betas = betas.T
betas = pya.pp.epicv2_probe_aggregation(betas)
|-----> 🏗️ Starting epicv2_probe_aggregation function
|-----> ⚙️ Looking for duplicated probes started
|-----------> in progress: 100.0000%
|-----------> There are no duplicated probes. Returning original data
|-----> 🎉 Done! [17.0187s]

adata = pya.pp.df_to_adata(betas, imputer_strategy='knn')
|-----> 🏗️ Starting df_to_adata function
|-----> ⚙️ Create anndata object started
|-----------? Dropping 669 columns with only NAs: ['cg25399512', 'cg15734032', 'cg16292782'], etc.
|-----> ⚠️ Create anndata object finished [1.5476s]
|-----> ⚙️ Add metadata to anndata started
|-----------? No metadata provided. Leaving adata.obs empty
|-----> ⚠️ Add metadata to anndata finished [0.0013s]
|-----> ⚙️ Log data statistics started
|-----------> There are 87 observations
|-----------> There are 866226 features
|-----------> Total missing values: 41628
|-----------> Percentage of missing values: 0.06%
|-----> ✅ Log data statistics finished [0.0886s]
|-----> ⚙️ Impute missing values started
|-----------> Imputing missing values using knn strategy
|-----> ✅ Impute missing values finished [21.9341s]
|-----> ⚙️ Add imputer strategy to adata.uns started
|-----> ✅ Add imputer strategy to adata.uns finished [0.0008s]
|-----> 🎉 Done! [23.5831s]

encen100_results = pya.pred.predict_age(adata, ['encen100'])
|-----> 🏗️ Starting predict_age function
|-----> ⚙️ Set PyTorch device started
|-----------> Using device: cpu
|-----> ✅ Set PyTorch device finished [0.0015s]
|-----> 🕒 Processing clock: encen100
|-----------> ⚙️ Load clock started
|-----------------> Data found in pyaging_data/encen100.pt
|-----------> ✅ Load clock finished [0.0091s]
|-----------> ⚙️ Check features in adata started
|-----------------> All features are present in adata.var_names.
|-----------> ✅ Check features in adata finished [0.2808s]
|-----------> ⚙️ Predict ages with model started
|-----------------> There is no preprocessing necessary
|-----------------> There is no postprocessing necessary
|-----------------> in progress: 100.0000%
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Cell In[8], line 1
----> 1 encen100_results = pya.pred.predict_age(adata, ['encen100'])

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/pyaging/predict/_pred.py:107, in predict_age(adata, clock_names, dir, batch_size, clean, verbose)
     99 check_features_in_adata(
    100     adata,
    101     model,
    102     logger,
    103     indent_level=2,
    104 )
    106 # Perform age prediction using the model applying preprocessing and postprocessing steps
--> 107 predicted_ages_tensor = predict_ages_with_model(adata, model, device, batch_size, logger, indent_level=2)
    109 # Add predicted ages and clock metadata to adata
    110 add_pred_ages_and_clock_metadata_adata(adata, model, predicted_ages_tensor, dir, logger, indent_level=2)

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/pyaging/utils/_utils.py:66, in progress.<locals>.decorator.<locals>.wrapper(*args, **kwargs)
     64 logger = args[-1]  # Assumes logger is the last positional argument
     65 logger.start_progress(f"{message} started", indent_level=indent_level)
---> 66 result = func(*args, **kwargs)
     67 logger.finish_progress(f"{message} finished", indent_level=indent_level)
     68 return result

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/pyaging/predict/_pred_utils.py:315, in predict_ages_with_model(adata, model, device, batch_size, logger, indent_level)
    313 with torch.inference_mode():
    314     for batch in main_tqdm(dataloader, indent_level=indent_level + 1, logger=logger):
--> 315         batch_pred = model(batch.obsm[f"X_{model.metadata['clock_name']}"])
    316         predictions.append(batch_pred)
    317 # Concatenate all batch predictions

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/torch/nn/modules/module.py:1511, in Module._wrapped_call_impl(self, *args, **kwargs)
   1509     return self._compiled_call_impl(*args, **kwargs)  # type: ignore[misc]
   1510 else:
-> 1511     return self._call_impl(*args, **kwargs)

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/torch/nn/modules/module.py:1520, in Module._call_impl(self, *args, **kwargs)
   1515 # If we don't have any hooks, we want to skip the rest of the logic in
   1516 # this function, and just call forward.
   1517 if not (self._backward_hooks or self._backward_pre_hooks or self._forward_hooks or self._forward_pre_hooks
   1518         or _global_backward_pre_hooks or _global_backward_hooks
   1519         or _global_forward_hooks or _global_forward_pre_hooks):
-> 1520     return forward_call(*args, **kwargs)
   1522 try:
   1523     result = None

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/pyaging/models/_base_models.py:40, in pyagingModel.forward(self, x)
     38 def forward(self, x):
     39     x = self.preprocess(x)
---> 40     x = self.base_model(x)
     41     x = self.postprocess(x)
     42     return x

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/torch/nn/modules/module.py:1511, in Module._wrapped_call_impl(self, *args, **kwargs)
   1509     return self._compiled_call_impl(*args, **kwargs)  # type: ignore[misc]
   1510 else:
-> 1511     return self._call_impl(*args, **kwargs)

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/torch/nn/modules/module.py:1520, in Module._call_impl(self, *args, **kwargs)
   1515 # If we don't have any hooks, we want to skip the rest of the logic in
   1516 # this function, and just call forward.
   1517 if not (self._backward_hooks or self._backward_pre_hooks or self._forward_hooks or self._forward_pre_hooks
   1518         or _global_backward_pre_hooks or _global_backward_hooks
   1519         or _global_forward_hooks or _global_forward_pre_hooks):
-> 1520     return forward_call(*args, **kwargs)
   1522 try:
   1523     result = None

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/pyaging/models/_base_models.py:68, in LinearModel.forward(self, x)
     67 def forward(self, x):
---> 68     x = self.linear(x)
     69     return x

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/torch/nn/modules/module.py:1511, in Module._wrapped_call_impl(self, *args, **kwargs)
   1509     return self._compiled_call_impl(*args, **kwargs)  # type: ignore[misc]
   1510 else:
-> 1511     return self._call_impl(*args, **kwargs)

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/torch/nn/modules/module.py:1520, in Module._call_impl(self, *args, **kwargs)
   1515 # If we don't have any hooks, we want to skip the rest of the logic in
   1516 # this function, and just call forward.
   1517 if not (self._backward_hooks or self._backward_pre_hooks or self._forward_hooks or self._forward_pre_hooks
   1518         or _global_backward_pre_hooks or _global_backward_hooks
   1519         or _global_forward_hooks or _global_forward_pre_hooks):
-> 1520     return forward_call(*args, **kwargs)
   1522 try:
   1523     result = None

File ~/Library/spyder-6/envs/spyder-runtime/lib/python3.11/site-packages/torch/nn/modules/linear.py:116, in Linear.forward(self, input)
    115 def forward(self, input: Tensor) -> Tensor:
--> 116     return F.linear(input, self.weight, self.bias)

RuntimeError: mat1 and mat2 must have the same dtype, but got Float and Double

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions